pg_saurus 2.2.1 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc9bebafd878bea837a77e847e87acb017eaf59b
4
- data.tar.gz: 3abfea5605d0181799be4d013c1cc6e67ebef965
3
+ metadata.gz: 3e759d3f6f18831227c70d8d5609d0545053a3ec
4
+ data.tar.gz: 6bacd12ec585be568ad2863c9cc7dedb112b97fd
5
5
  SHA512:
6
- metadata.gz: 597de2bbbdb25a36efda49b39796bda5f0ee3ca234495e0b429b2a08ff95fcbd0a43d71b4ba0cc4238a11b2278dec0a1e6a18e776a45d6185589ffa9ecc893e9
7
- data.tar.gz: 9f4825c215da71f42800a60fc0a3dc788bc77bf9ef618a3d67930f3e8f074c00a119a510136b2e51611c8ec135a54863a26e183004edd15c663d898f67823b6e
6
+ metadata.gz: 66c2279cce0676edd0084721a66ef4faf325df16e43e77649b9cc0bf95bf6a41af41f43c645d14d711656ed1159c9ff80dec6e95b7ec450ee5f97fb257e3c910
7
+ data.tar.gz: 8d33063a06e25aaf16868674bee9c2c9811237ac82d2519c78cccdbdc45837027aba1fb18376ed495a3f460a23608b3eb0257944ec28cc1e95f03a59eec87f6f
@@ -310,6 +310,32 @@ PgSaurus.configre do |config|
310
310
  end
311
311
  ```
312
312
 
313
+ ## Functions
314
+
315
+ You can create, list, and drop functions.
316
+
317
+ ### Examples
318
+
319
+ ```ruby
320
+ pets_not_empty_function = <<-SQL
321
+ BEGIN
322
+ IF (SELECT COUNT(*) FROM pets) > 0
323
+ THEN
324
+ RETURN true;
325
+ ELSE
326
+ RETURN false;
327
+ END IF;
328
+ END;
329
+ SQL
330
+
331
+ create_function 'pets_not_empty()', :boolean, pets_not_empty_function, schema: 'public'
332
+ functions.any?{ |function| function.name == 'public.pets_not_empty()' }
333
+ # => true
334
+ drop_function 'pets_not_empty()'
335
+ functions.any?{ |function| function.name == 'public.pets_not_empty()' }
336
+ # => false
337
+ ```
338
+
313
339
  ## Tools
314
340
 
315
341
  PgSaurus::Tools provides a number of useful methods:
@@ -357,14 +383,14 @@ Support for JRuby:
357
383
  ## Credits
358
384
 
359
385
  * [Potapov Sergey](https://github.com/greyblake) - schema support
360
- * [Arthur Shagall](https://github.com/albertosaurus) - thanks for [pg_comment](https://github.com/albertosaurus/pg_comment)
386
+ * [Arthur Shagall](https://github.com/albertosaurus) - function support - and thanks for [pg_comment](https://github.com/albertosaurus/pg_comment)
361
387
  * [Matthew Higgins](https://github.com/matthuhiggins) - thanks for [foreigner](https://github.com/matthuhiggins/foreigner), which was used as a base for the foreign key support
362
388
  * [Artem Ignatyev](https://github.com/cryo28) - extension modules load/unload support
363
389
  * [Marcelo Silveira](https://github.com/mhfs) - thanks for rails partial index support that was backported into this gem
364
390
 
365
391
  ## Copyright and License
366
392
 
367
- * Copyright (c) 2014 HornsAndHooves.
393
+ * Copyright (c) 2015 HornsAndHooves.
368
394
  * Initial foreign key code taken from foreigner, Copyright (c) 2009 Matthew Higgins
369
395
  * pg_comment Copyright (c) 2011 Arthur Shagall
370
396
  * Partial index Copyright (c) 2012 Marcelo Silveira
@@ -6,4 +6,5 @@ module PgSaurus::ConnectionAdapters # :nodoc:
6
6
  autoload :Table
7
7
  autoload :ForeignKeyDefinition
8
8
  autoload :IndexDefinition, 'pg_saurus/connection_adapters/index_definition'
9
+ autoload :FunctionDefinition, 'pg_saurus/connection_adapters/function_definition'
9
10
  end
@@ -7,11 +7,13 @@ module PgSaurus::ConnectionAdapters::AbstractAdapter
7
7
  autoload :ForeignerMethods
8
8
  autoload :SchemaMethods
9
9
  autoload :IndexMethods
10
+ autoload :FunctionMethods
10
11
 
11
12
  include CommentMethods
12
13
  include ForeignerMethods
13
14
  include SchemaMethods
14
15
  include IndexMethods
16
+ include FunctionMethods
15
17
 
16
18
  included do
17
19
  alias_method_chain :create_table, :schema_option
@@ -0,0 +1,24 @@
1
+ # Adapter definitions for DB functions.
2
+ module PgSaurus::ConnectionAdapters::AbstractAdapter::FunctionMethods
3
+
4
+ # :nodoc
5
+ def supports_functions?
6
+ false
7
+ end
8
+
9
+ # Create a database function.
10
+ def create_function(function_name, returning, definition, options = {})
11
+
12
+ end
13
+
14
+ # Delete the database function.
15
+ def drop_function(function_name, options)
16
+
17
+ end
18
+
19
+ # Return the listing of currently defined DB functions.
20
+ def functions
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,10 @@
1
+ module PgSaurus::ConnectionAdapters
2
+ # Struct definition for a DB function.
3
+ class FunctionDefinition < Struct.new( :name,
4
+ :returning,
5
+ :definition,
6
+ :function_type,
7
+ :language,
8
+ :oid )
9
+ end
10
+ end
@@ -12,6 +12,7 @@ module PgSaurus::ConnectionAdapters::PostgreSQLAdapter
12
12
  autoload :IndexMethods, 'pg_saurus/connection_adapters/postgresql_adapter/index_methods'
13
13
  autoload :TranslateException, 'pg_saurus/connection_adapters/postgresql_adapter/translate_exception'
14
14
  autoload :ViewMethods, 'pg_saurus/connection_adapters/postgresql_adapter/view_methods'
15
+ autoload :FunctionMethods, 'pg_saurus/connection_adapters/postgresql_adapter/function_methods'
15
16
 
16
17
  include ExtensionMethods
17
18
  include SchemaMethods
@@ -20,6 +21,7 @@ module PgSaurus::ConnectionAdapters::PostgreSQLAdapter
20
21
  include IndexMethods
21
22
  include TranslateException
22
23
  include ViewMethods
24
+ include FunctionMethods
23
25
 
24
26
  included do
25
27
  alias_method_chain :tables, :non_public_schema_tables
@@ -0,0 +1,109 @@
1
+ # Methods to extend {ActiveRecord::ConnectionAdapters::PostgreSQLAdapter}
2
+ # to support database functions.
3
+ module PgSaurus::ConnectionAdapters::PostgreSQLAdapter::FunctionMethods
4
+
5
+ # Return +true+.
6
+ def supports_functions?
7
+ true
8
+ end
9
+
10
+ # Return a list of defined DB functions. Ignore function definitions that can't be parsed.
11
+ def functions
12
+ res = select_all <<-SQL
13
+ SELECT n.nspname AS "Schema",
14
+ p.proname AS "Name",
15
+ pg_catalog.pg_get_function_result(p.oid) AS "Returning",
16
+ CASE
17
+ WHEN p.proisagg THEN 'agg'
18
+ WHEN p.proiswindow THEN 'window'
19
+ WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype
20
+ THEN 'trigger'
21
+ ELSE 'normal'
22
+ END AS "Type",
23
+ p.oid AS "Oid"
24
+ FROM pg_catalog.pg_proc p
25
+ LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
26
+ WHERE pg_catalog.pg_function_is_visible(p.oid)
27
+ AND n.nspname <> 'pg_catalog'
28
+ AND n.nspname <> 'information_schema'
29
+ ORDER BY 1, 2, 3, 4;
30
+ SQL
31
+ res.inject([]) do |buffer, row|
32
+ returning = row['Returning']
33
+ function_type = row['Type']
34
+ oid = row['Oid']
35
+
36
+ function_str = select_value("SELECT pg_get_functiondef(#{oid});")
37
+
38
+ name = parse_function_name(function_str)
39
+ language = parse_function_language(function_str)
40
+ definition = parse_function_definition(function_str)
41
+
42
+ if definition
43
+ buffer << ::PgSaurus::ConnectionAdapters::FunctionDefinition.new(name,
44
+ returning,
45
+ definition.strip,
46
+ function_type,
47
+ language,
48
+ oid)
49
+ end
50
+ buffer
51
+ end
52
+ end
53
+
54
+ # Create a new database function.
55
+ def create_function(function_name, returning, definition, options = {})
56
+
57
+ function_name = full_function_name(function_name, options)
58
+ language = options[:language] || 'plpgsql'
59
+ replace = if options[:replace] == false
60
+ ''
61
+ else
62
+ 'OR REPLACE '
63
+ end
64
+
65
+ sql = <<-SQL.gsub(/^[ ]{6}/, "")
66
+ CREATE #{replace}FUNCTION #{function_name}
67
+ RETURNS #{returning}
68
+ LANGUAGE #{language}
69
+ AS $function$
70
+ #{definition.strip}
71
+ $function$
72
+ SQL
73
+
74
+ execute(sql)
75
+ end
76
+
77
+ # Drop the given database function.
78
+ def drop_function(function_name, options = {})
79
+ function_name = full_function_name(function_name, options)
80
+
81
+ execute "DROP FUNCTION #{function_name}"
82
+ end
83
+
84
+ # Retrieve the function name from the function SQL.
85
+ def parse_function_name(function_str)
86
+ function_str.split("\n").find { |line| line =~ /^CREATE[\s\S]+FUNCTION/ }.split(' ').last
87
+ end
88
+ private :parse_function_name
89
+
90
+ # Retrieve the function language from the function SQL.
91
+ def parse_function_language(function_str)
92
+ function_str.split("\n").find { |line| line =~ /LANGUAGE/ }.split(' ').last
93
+ end
94
+ private :parse_function_language
95
+
96
+ # Retrieve the function definition from the function SQL.
97
+ def parse_function_definition(function_str)
98
+ function_str[/#{Regexp.escape("AS $function$\n")}(.*?)#{Regexp.escape("$function$")}/m, 1]
99
+ end
100
+ private :parse_function_definition
101
+
102
+ # Write out the fully qualified function name if the :schema option is passed.
103
+ def full_function_name(function_name, options)
104
+ schema = options[:schema]
105
+ function_name = "#{schema}.#{function_name}" if schema
106
+ function_name
107
+ end
108
+ private :full_function_name
109
+ end
@@ -8,10 +8,12 @@ module PgSaurus::Migration::CommandRecorder
8
8
  autoload :CommentMethods
9
9
  autoload :ForeignerMethods
10
10
  autoload :ViewMethods
11
+ autoload :FunctionMethods
11
12
 
12
13
  include ExtensionMethods
13
14
  include SchemaMethods
14
15
  include CommentMethods
15
16
  include ForeignerMethods
16
17
  include ViewMethods
18
+ include FunctionMethods
17
19
  end
@@ -0,0 +1,23 @@
1
+ # Methods to extend ActiveRecord::Migration::CommandRecorder to
2
+ # support comments feature.
3
+ module PgSaurus::Migration::CommandRecorder::FunctionMethods
4
+
5
+ # :nodoc
6
+ def create_function(*args)
7
+ record :create_function, *args
8
+ end
9
+
10
+ # :nodoc
11
+ def drop_function(*args)
12
+ record :drop_function, *args
13
+ end
14
+
15
+ # :nodoc
16
+ def invert_create_function(args)
17
+ function_name = args.first
18
+ schema = args.last[:schema]
19
+
20
+ [:drop_function, [function_name, { schema: schema }]]
21
+ end
22
+
23
+ end
@@ -10,19 +10,22 @@ module PgSaurus::SchemaDumper
10
10
  autoload :SchemaMethods
11
11
  autoload :ForeignerMethods
12
12
  autoload :ViewMethods
13
+ autoload :FunctionMethods
13
14
 
14
15
  include ExtensionMethods
15
16
  include CommentMethods
16
17
  include SchemaMethods
17
18
  include ForeignerMethods
18
19
  include ViewMethods
20
+ include FunctionMethods
19
21
 
20
22
  included do
21
23
  alias_method_chain :header, :schemas
22
24
  alias_method_chain :header, :extensions
23
25
 
24
26
  alias_method_chain :tables, :views
25
- alias_method_chain :tables, :comments
26
27
  alias_method_chain :tables, :foreign_keys
28
+ alias_method_chain :tables, :functions
29
+ alias_method_chain :tables, :comments
27
30
  end
28
31
  end
@@ -0,0 +1,24 @@
1
+ # Support for dumping database functions.
2
+ module PgSaurus::SchemaDumper::FunctionMethods
3
+
4
+ # :nodoc
5
+ def tables_with_functions(stream)
6
+ tables_without_functions(stream)
7
+
8
+ dump_functions stream
9
+
10
+ stream
11
+ end
12
+
13
+ # Writes out a command to create each detected function.
14
+ def dump_functions(stream)
15
+ @connection.functions.each do |function|
16
+ statement = " create_function '#{function.name}', :#{function.returning}, <<-FUNCTION_DEFINITION.gsub(/^[\s]{4}/, '')"
17
+ statement << "\n#{function.definition.split("\n").map{|line| " #{line}" }.join("\n")}"
18
+ statement << "\n FUNCTION_DEFINITION\n\n"
19
+
20
+ stream.puts statement
21
+ end
22
+ end
23
+
24
+ end
@@ -1,4 +1,4 @@
1
1
  module PgSaurus
2
2
  # Version of pg_saurus gem.
3
- VERSION = '2.2.1'
3
+ VERSION = '2.3.1'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_saurus
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Potapov Sergey
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2014-09-22 00:00:00.000000000 Z
16
+ date: 2015-07-14 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: pg
@@ -33,6 +33,9 @@ dependencies:
33
33
  name: rails
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
+ - - "<"
37
+ - !ruby/object:Gem::Version
38
+ version: '4.2'
36
39
  - - "~>"
37
40
  - !ruby/object:Gem::Version
38
41
  version: '4.0'
@@ -40,6 +43,9 @@ dependencies:
40
43
  prerelease: false
41
44
  version_requirements: !ruby/object:Gem::Requirement
42
45
  requirements:
46
+ - - "<"
47
+ - !ruby/object:Gem::Version
48
+ version: '4.2'
43
49
  - - "~>"
44
50
  - !ruby/object:Gem::Version
45
51
  version: '4.0'
@@ -168,14 +174,17 @@ files:
168
174
  - lib/pg_saurus/connection_adapters/abstract_adapter.rb
169
175
  - lib/pg_saurus/connection_adapters/abstract_adapter/comment_methods.rb
170
176
  - lib/pg_saurus/connection_adapters/abstract_adapter/foreigner_methods.rb
177
+ - lib/pg_saurus/connection_adapters/abstract_adapter/function_methods.rb
171
178
  - lib/pg_saurus/connection_adapters/abstract_adapter/index_methods.rb
172
179
  - lib/pg_saurus/connection_adapters/abstract_adapter/schema_methods.rb
173
180
  - lib/pg_saurus/connection_adapters/foreign_key_definition.rb
181
+ - lib/pg_saurus/connection_adapters/function_definition.rb
174
182
  - lib/pg_saurus/connection_adapters/index_definition.rb
175
183
  - lib/pg_saurus/connection_adapters/postgresql_adapter.rb
176
184
  - lib/pg_saurus/connection_adapters/postgresql_adapter/comment_methods.rb
177
185
  - lib/pg_saurus/connection_adapters/postgresql_adapter/extension_methods.rb
178
186
  - lib/pg_saurus/connection_adapters/postgresql_adapter/foreigner_methods.rb
187
+ - lib/pg_saurus/connection_adapters/postgresql_adapter/function_methods.rb
179
188
  - lib/pg_saurus/connection_adapters/postgresql_adapter/index_methods.rb
180
189
  - lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb
181
190
  - lib/pg_saurus/connection_adapters/postgresql_adapter/translate_exception.rb
@@ -191,6 +200,7 @@ files:
191
200
  - lib/pg_saurus/migration/command_recorder/comment_methods.rb
192
201
  - lib/pg_saurus/migration/command_recorder/extension_methods.rb
193
202
  - lib/pg_saurus/migration/command_recorder/foreigner_methods.rb
203
+ - lib/pg_saurus/migration/command_recorder/function_methods.rb
194
204
  - lib/pg_saurus/migration/command_recorder/schema_methods.rb
195
205
  - lib/pg_saurus/migration/command_recorder/view_methods.rb
196
206
  - lib/pg_saurus/migration/set_role_method.rb
@@ -198,6 +208,7 @@ files:
198
208
  - lib/pg_saurus/schema_dumper/comment_methods.rb
199
209
  - lib/pg_saurus/schema_dumper/extension_methods.rb
200
210
  - lib/pg_saurus/schema_dumper/foreigner_methods.rb
211
+ - lib/pg_saurus/schema_dumper/function_methods.rb
201
212
  - lib/pg_saurus/schema_dumper/schema_methods.rb
202
213
  - lib/pg_saurus/schema_dumper/view_methods.rb
203
214
  - lib/pg_saurus/tools.rb
@@ -223,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
234
  version: '0'
224
235
  requirements: []
225
236
  rubyforge_project:
226
- rubygems_version: 2.2.2
237
+ rubygems_version: 2.4.3
227
238
  signing_key:
228
239
  specification_version: 4
229
240
  summary: ActiveRecord extensions for PostgreSQL.