pg_power 1.6.4 → 2.0.0

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: ba398c2e068fec17d58c4785188309ae33248b95
4
- data.tar.gz: f4b9bd5557f8875600e8c33bdc40f41dfffa88bd
3
+ metadata.gz: c8b564bc64ebb7c31041272596e103eaad58e60e
4
+ data.tar.gz: 988c4d9cf044dc4b247e8437658011987efe6a31
5
5
  SHA512:
6
- metadata.gz: 329c679047292bfbec8ccf5f8303be6fb7da481e08fb1cc1537ac1c3d9e4216234eebd9915455cea8ee238bc3cb8912f65a9bfea20c915f90a93e1e4ab9fba17
7
- data.tar.gz: 589bf58b9678b12788d684ccdf7d4749231a708b58f5f2567f028f360337d8901f6a791be076e42e91c6f8cc13f49b108a618430fcf4ea1217006cf8d88bdc05
6
+ metadata.gz: 6497ef6e095d1bfe922a57c5ed692feb1bc8e93cf00ac1385ea3a844d442dbde8e9c3da8e0d92ec184547c332980834e40b8df5bafccf7dcb66b74c7d7f8a666
7
+ data.tar.gz: fe88de2ff07fe6f5969e2f43b75d7ffe03a45d468b2c387a60ac06ebe6d5a5eb786f7ab07a2be2e8c4bea55312f5e79f91076e09b34d2841d40d01bc59ede91b
@@ -145,7 +145,7 @@ add_foreign_key(:comments, :posts)
145
145
  ```
146
146
  Does not add an index:
147
147
  ```ruby
148
- add_foreign_key(:comments, :posts, :exclude_index => true)
148
+ add_foreign_key(:comments, :posts, :exclude_index => true)
149
149
  ```
150
150
  ## Partial Indexes
151
151
 
@@ -172,15 +172,15 @@ expressions are supported.
172
172
  Add an index to a column with a function
173
173
 
174
174
  ```ruby
175
- add_index(:comments, "lower(text)")
175
+ add_index(:comments, "lower(text)")
176
176
  ```
177
177
 
178
178
  You can also specify index access method
179
179
 
180
180
  ```ruby
181
- create_extension 'btree_gist'
182
- create_extension 'fuzzystrmatch'
183
- add_index(:comments, 'dmetaphone(author)', :using => 'gist')
181
+ create_extension 'btree_gist'
182
+ create_extension 'fuzzystrmatch'
183
+ add_index(:comments, 'dmetaphone(author)', :using => 'gist')
184
184
  ```
185
185
 
186
186
  ## Concurrent index creation
@@ -193,13 +193,13 @@ DSL on index and foreign keys creation.
193
193
  Add an index concurrently to a table
194
194
 
195
195
  ```ruby
196
- add_index :table, :column_id, :concurrently => true
196
+ add_index :table, :column_id, :concurrently => true
197
197
  ```
198
198
 
199
199
  Add an index concurrently along with foreign key
200
200
 
201
201
  ```ruby
202
- add_foreign_key :table1, :table2, :column => :column_id, :concurrent_index => true
202
+ add_foreign_key :table1, :table2, :column => :column_id, :concurrent_index => true
203
203
  ```
204
204
 
205
205
  ## Loading/Unloading postgresql extension modules
@@ -218,7 +218,7 @@ Load [fuzzystrmatch](http://www.postgresql.org/docs/9.1/static/fuzzystrmatch.htm
218
218
  and create its objects in schema *public*:
219
219
 
220
220
  ```ruby
221
- create_extension "fuzzystrmatch"
221
+ create_extension "fuzzystrmatch"
222
222
  ```
223
223
 
224
224
 
@@ -226,13 +226,13 @@ Load version *1.0* of the [btree_gist](http://www.postgresql.org/docs/9.1/static
226
226
  and create its objects in schema *demography*.
227
227
 
228
228
  ```ruby
229
- create_extension "btree_gist", :schema_name => "demography", :version => "1.0"
229
+ create_extension "btree_gist", :schema_name => "demography", :version => "1.0"
230
230
  ```
231
231
 
232
232
  Unload extension module:
233
233
 
234
234
  ```ruby
235
- drop_extension "fuzzystrmatch"
235
+ drop_extension "fuzzystrmatch"
236
236
  ```
237
237
 
238
238
  ## Views
@@ -243,7 +243,7 @@ that it is preliminary 'alpha' at best.
243
243
  ### Example
244
244
 
245
245
  ```ruby
246
- create_view "demography.citizens_view", "select * from demography.citizens"
246
+ create_view "demography.citizens_view", "select * from demography.citizens"
247
247
  ```
248
248
 
249
249
  ## Tools
@@ -256,6 +256,15 @@ PgPower::Tools.drop_schema "services" # => remove the PG schem
256
256
  PgPower::Tools.schemas # => ["public", "information_schema", "nets"]
257
257
  PgPower::Tools.index_exists?(table, columns, options) # => returns true if an index exists for the given params
258
258
  ```
259
+
260
+ ## Rails 3
261
+
262
+ If you are using rails 3.x, use previous pg_power version:
263
+
264
+ ```ruby
265
+ gem 'pg_power', '~> 1.6.4'
266
+ ```
267
+
259
268
  ## Running tests:
260
269
 
261
270
  * Ensure your postgresql has postgres-contrib (Ubuntu) package installed. Tests depend on btree_gist and fuzzystrmatch extensions
@@ -5,6 +5,9 @@ module ActiveRecord
5
5
  # function call
6
6
  FUNCTIONAL_INDEX_REGEXP = /(\w+)\(((?:'.+'(?:::\w+)?, *)*)(\w+)\)/
7
7
 
8
+
9
+ # Redefine original add_index method to handle :concurrently option.
10
+ #
8
11
  # Adds a new index to the table. +column_name+ can be a single Symbol, or
9
12
  # an Array of Symbols.
10
13
  #
@@ -19,8 +22,15 @@ module ActiveRecord
19
22
  # WHERE
20
23
  # active
21
24
  #
22
- def add_index(table_name, column_name, options = {})
23
- name, type, creation_method, columns, opts = add_index_options(table_name, column_name, options)
25
+ def add_index_with_concurrently(table_name, column_name, options = {})
26
+ creation_method = options.delete(:concurrently) ? 'CONCURRENTLY' : nil
27
+
28
+ index_name,
29
+ index_type,
30
+ index_columns,
31
+ index_options,
32
+ index_algorithm,
33
+ index_using = add_index_options(table_name, column_name, options)
24
34
 
25
35
  # GOTCHA:
26
36
  # It ensures that there is no existing index only for the case when the index
@@ -33,22 +43,28 @@ module ActiveRecord
33
43
  # indexes. But note that this handles only one of the cases when index
34
44
  # creation can fail!!! All other case should be procesed manually.
35
45
  # -- zekefast 2012-09-25
36
- if options.has_key?(:concurrently) && index_exists?(table_name, column_name, options)
37
- raise ::PgPower::IndexExistsError, "Index #{name} for `#{table_name}.#{column_name}` " \
38
- "column can not be created concurrently, because such index already exists."
46
+ if creation_method.present? && index_exists?(table_name, column_name, options)
47
+ raise ::PgPower::IndexExistsError,
48
+ "Index #{index_name} for `#{table_name}.#{column_name}` " \
49
+ "column can not be created concurrently, because such index already exists."
39
50
  end
40
51
 
41
- sql = ["CREATE #{type} INDEX"]
42
- sql << creation_method.to_s
43
- sql << quote_column_name(name)
44
- sql << "ON #{quote_table_name(table_name)}"
45
- sql << "USING #{options[:using].to_s.downcase}" if options[:using]
46
- sql << "(#{columns})#{opts}"
52
+ statements = []
53
+ statements << "CREATE #{index_type} INDEX"
54
+ statements << creation_method if creation_method.present?
55
+ statements << index_algorithm if index_algorithm.present?
56
+ statements << quote_column_name(index_name)
57
+ statements << "ON"
58
+ statements << quote_table_name(table_name)
59
+ statements << index_using if index_using.present?
60
+ statements << "(#{index_columns})" if index_columns.present?
61
+ statements << index_options if index_options.present?
47
62
 
48
- execute sql.join(" ")
63
+ sql = statements.join(' ')
64
+ execute(sql)
49
65
  end
50
66
 
51
- # Checks to see if an index exists on a table for a given index definition.
67
+ # Check to see if an index exists on a table for a given index definition.
52
68
  #
53
69
  # === Examples
54
70
  # # Check that a partial index exists
@@ -97,7 +113,7 @@ module ActiveRecord
97
113
  end
98
114
  end
99
115
 
100
- # Derives the name of the index from the given table name and options hash.
116
+ # Derive the name of the index from the given table name and options hash.
101
117
  def index_name(table_name, options) #:nodoc:
102
118
  if Hash === options # legacy support
103
119
  if options[:column]
@@ -113,39 +129,7 @@ module ActiveRecord
113
129
  end
114
130
  end
115
131
 
116
- # Returns options used to build out index SQL
117
- #
118
- # Added support for partial indexes implemented using the :where option
119
- #
120
- def add_index_options(table_name, column_name, options = {})
121
- column_names = Array(column_name)
122
- index_name = index_name(table_name, :column => column_names)
123
- index_creation_method = nil
124
-
125
- if Hash === options # legacy support, since this param was a string
126
- index_type = options[:unique] ? 'UNIQUE' : ''
127
- index_creation_method = options[:concurrently] ? 'CONCURRENTLY' : ''
128
- index_name = options[:name].to_s if options.key?(:name)
129
- if supports_partial_index?
130
- index_options = options[:where] ? " WHERE #{options[:where]}" : ''
131
- end
132
- else
133
- index_type = options
134
- end
135
-
136
- if index_name.length > index_name_length
137
- raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{index_name_length} characters"
138
- end
139
- if index_name_exists?(table_name, index_name, false)
140
- raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists"
141
- end
142
- index_columns = quoted_columns_for_index(column_names, options).join(', ')
143
-
144
- [index_name, index_type, index_creation_method, index_columns, index_options]
145
- end
146
- protected :add_index_options
147
-
148
- # Override super method to provide support for expression column names
132
+ # Override super method to provide support for expression column names.
149
133
  def quoted_columns_for_index(column_names, options = {})
150
134
  column_names.map do |name|
151
135
  if name =~ FUNCTIONAL_INDEX_REGEXP
@@ -157,7 +141,7 @@ module ActiveRecord
157
141
  end
158
142
  protected :quoted_columns_for_index
159
143
 
160
- # Map an expression to a name appropriate for an index
144
+ # Map an expression to a name appropriate for an index.
161
145
  def expression_index_name(column_name)
162
146
  if column_name =~ FUNCTIONAL_INDEX_REGEXP
163
147
  "#{$1.downcase}_#{$3}"
@@ -4,15 +4,6 @@ module ActiveRecord # :nodoc:
4
4
  # Patched methods::
5
5
  # * indexes
6
6
  class PostgreSQLAdapter
7
- # In Rails3.2 method #extract_schema_and_table is moved into Utils module.
8
- # In Rails3.1 it's implemented right in PostgreSQLAdapter class.
9
- # So it's Rails3.2 we include the module into PostgreSQLAdapter in order to make
10
- # it compatible to Rails3.1
11
- # -- sergey.potapov 2012-06-25
12
- if ActiveRecord::VERSION::STRING =~ /^3\.2/
13
- include self::Utils
14
- end
15
-
16
7
  # Regex to find columns used in index statements
17
8
  INDEX_COLUMN_EXPRESSION = /ON \w+(?: USING \w+ )?\((.+)\)/
18
9
  # Regex to find where clause in index statements
@@ -38,7 +29,7 @@ module ActiveRecord # :nodoc:
38
29
  # the custom {PgPower::ConnectionAdapters::IndexDefinition}
39
30
  #
40
31
  def indexes(table_name, name = nil)
41
- schema, table = extract_schema_and_table(table_name)
32
+ schema, table = Utils.extract_schema_and_table(table_name)
42
33
  schemas = schema ? "ARRAY['#{schema}']" : 'current_schemas(false)'
43
34
 
44
35
  result = query(<<-SQL, name)
@@ -23,5 +23,6 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter
23
23
 
24
24
  included do
25
25
  alias_method_chain :tables, :non_public_schema_tables
26
+ alias_method_chain :add_index, :concurrently
26
27
  end
27
28
  end
@@ -1,7 +1,7 @@
1
1
  # Provides methods to extend {ActiveRecord::ConnectionAdapters::PostgreSQLAdapter}
2
2
  # to support extensions feature.
3
3
  module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
4
- # Default options for {#create_extension} method
4
+ # Default options for {#create_extension} method.
5
5
  CREATE_EXTENSION_DEFAULTS = {
6
6
  :if_not_exists => true,
7
7
  :schema_name => nil,
@@ -9,7 +9,7 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
9
9
  :old_version => nil
10
10
  }
11
11
 
12
- # Default options for {#drop_extension} method
12
+ # Default options for {#drop_extension} method.
13
13
  DROP_EXTENSION_DEFAULTS = {
14
14
  :if_exists => true,
15
15
  :mode => :restrict
@@ -29,7 +29,7 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
29
29
  true
30
30
  end
31
31
 
32
- # Executes SQL to load a postgresql extension module into the current database
32
+ # Execute SQL to load a postgresql extension module into the current database.
33
33
  #
34
34
  # @param [#to_s] extension_name Name of the extension module to load
35
35
  # @param [Hash] options
@@ -52,7 +52,7 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
52
52
  end
53
53
 
54
54
 
55
- # Executes SQL to remove a postgresql extension module from the current database
55
+ # Execute SQL to remove a postgresql extension module from the current database.
56
56
  #
57
57
  # @param [#to_s] extension_name Name of the extension module to unload
58
58
  # @param [Hash] options
@@ -80,7 +80,11 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
80
80
  execute(sql)
81
81
  end
82
82
 
83
- # Queries pg_catalog for all loaded to the current database extension modules
83
+ # Query the pg_catalog for all extension modules loaded to the current database.
84
+ #
85
+ # @note
86
+ # Since Rails 4 connection has method +extensions+ that returns array of extensions.
87
+ # This method is slightly different, since it returns also additional options.
84
88
  #
85
89
  # Please note all extensions which belong to pg_catalog schema are omitted
86
90
  # ===Example
@@ -90,7 +94,7 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
90
94
  # }
91
95
  #
92
96
  # @return [Hash{String => Hash{Symbol => String}}] A list of loaded extensions with their options
93
- def extensions
97
+ def pg_extensions
94
98
  # Check postgresql version to not break on Postgresql < 9.1 during schema dump
95
99
  pg_version_str = select_value('SELECT version()')
96
100
  return {} unless pg_version_str =~ /^PostgreSQL (\d+\.\d+.\d+)/ && ($1 >= '9.1')
@@ -103,7 +107,7 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
103
107
  SQL
104
108
 
105
109
  result = select_all(sql)
106
- result.map! do |row|
110
+ formatted_result = result.map do |row|
107
111
  [
108
112
  row['ext_name'],
109
113
  {
@@ -113,6 +117,6 @@ module PgPower::ConnectionAdapters::PostgreSQLAdapter::ExtensionMethods
113
117
  ]
114
118
  end
115
119
 
116
- Hash[result]
120
+ Hash[formatted_result]
117
121
  end
118
122
  end
@@ -116,7 +116,9 @@ module PgPower::CreateIndexConcurrently
116
116
 
117
117
  options[:column] ||= connection.id_column_name_from_table_name(to_table)
118
118
  options = options.merge(:concurrently => options[:concurrent_index])
119
- enque(from_table, options[:column], options)
119
+
120
+ index_options = { :concurrently => true }
121
+ enque(from_table, options[:column], index_options)
120
122
  end
121
123
 
122
124
  # GOTCHA:
@@ -12,7 +12,7 @@ module PgPower::SchemaDumper::ExtensionMethods
12
12
  #
13
13
  # @param [#puts] stream Stream to write to
14
14
  def dump_extensions(stream)
15
- extensions = @connection.extensions
15
+ extensions = @connection.pg_extensions
16
16
  commands = extensions.map do |extension_name, options|
17
17
  result = [%Q|create_extension "#{extension_name}"|]
18
18
  result << %Q|:schema_name => "#{options[:schema_name]}"| unless options[:schema_name] == 'public'
@@ -1,4 +1,4 @@
1
1
  module PgPower
2
2
  # Version of pg_power gem.
3
- VERSION = '1.6.4'
3
+ VERSION = '2.0.0'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_power
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.4
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Potapov Sergey
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-01-16 00:00:00.000000000 Z
15
+ date: 2014-01-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: pg
@@ -34,14 +34,14 @@ dependencies:
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: '3.1'
37
+ version: '4.0'
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- version: '3.1'
44
+ version: '4.0'
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: rspec-rails
47
47
  requirement: !ruby/object:Gem::Requirement
@@ -98,6 +98,20 @@ dependencies:
98
98
  - - '>='
99
99
  - !ruby/object:Gem::Version
100
100
  version: '0'
101
+ - !ruby/object:Gem::Dependency
102
+ name: pry
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
101
115
  description: ActiveRecord extensions for PostgreSQL. Provides useful tools for schema,
102
116
  foreign_key, index, comment and extensios manipulations in migrations.
103
117
  email: