pg_power 1.6.4 → 2.0.0

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: 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: