pgbundle 0.0.7 → 0.0.9

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: 23f31c6d663d2a95c1df84d4a32798b755e34033
4
- data.tar.gz: bd4b093c3c50837936317417fbe9c9b09f93603e
3
+ metadata.gz: 5c92283e7b0cdc9239828c2e0b0c4c0f0de445f8
4
+ data.tar.gz: d17777f703f2296061e87d11e8dc1f91f5915d9b
5
5
  SHA512:
6
- metadata.gz: 0f0d0754be9f1769ff53436ef752842b52011e60a3cda8c714ff3908697139369d98a22c2f72d3b26ef4ef332a47653c8ac649e74a25a1e1405c51b1ce73580e
7
- data.tar.gz: ae01c5f1ae1f1a83ab077d3805ccf3ad4dc777722ea5bb323b958090477650008a418c4b5fb4e31642dac02cf05f166802f8c99b62c00be344dba2ce638a76c7
6
+ metadata.gz: cb211cac9c484da384c3e70cff5125060fd5e548839ebdb4673f42f4305a4c50b3d7dc22181c21a1b55a50ceec1d3624d58de8dc107114e459ed26f71bb7e387
7
+ data.tar.gz: ad84fbf4ce4985c9fb6be3b8b363068e16930df7b83c83f505cb0d686581e2785d7f4239c62cd7938fab6fe31cffc35dce4fd6841875aa501a165b54b274f041
data/bin/pgbundle CHANGED
@@ -44,6 +44,13 @@ module PgBundle
44
44
  exit 1 if missing
45
45
  end
46
46
 
47
+ desc 'create', 'create the extension at the desired version'
48
+ def create(pgfile = 'Pgfile')
49
+ definition(pgfile).create.each do | d |
50
+ say_status('created', d.name)
51
+ end
52
+ end
53
+
47
54
  desc 'init', 'write an initial pgfile to stdout'
48
55
  method_options %w( user -u ) => :string
49
56
  method_options %w( host -h ) => :string
@@ -32,6 +32,8 @@ module PgBundle
32
32
  end
33
33
  end
34
34
 
35
+ alias_method :exec, :execute
36
+
35
37
  def transaction(&block)
36
38
  silence do
37
39
  connection.transaction(&block)
@@ -40,6 +40,14 @@ module PgBundle
40
40
  installed.select { |dep| dep.available?(database) }
41
41
  end
42
42
 
43
+ # create all required extensions
44
+ def create
45
+ extensions.map do |_, dep|
46
+ dep.create_with_dependencies(database)
47
+ dep
48
+ end
49
+ end
50
+
43
51
  def init
44
52
  ["database '#{database.name}', host: '#{database.host}', user: #{database.user}, system_user: #{database.system_user}, use_sudo: #{database.use_sudo}"] +
45
53
  database.current_definition.map do |r|
@@ -65,11 +65,11 @@ module PgBundle
65
65
  end
66
66
 
67
67
  # returns true if extension is already created with the correct version in the given database
68
- def created?(database)
68
+ def created?(database_or_connection)
69
69
  if version
70
- result = database.execute("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND version = '#{version}' AND installed").to_a
70
+ result = database_or_connection.exec("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND version = '#{version}' AND installed").to_a
71
71
  else
72
- result = database.execute("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND installed").to_a
72
+ result = database_or_connection.exec("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND installed").to_a
73
73
  end
74
74
 
75
75
  if result.empty?
@@ -81,11 +81,11 @@ module PgBundle
81
81
 
82
82
  # returns if the extension is already installed on the database system
83
83
  # if it is also already created it returns the installed version
84
- def installed?(database)
84
+ def installed?(database_or_connection)
85
85
  if version
86
- result = database.execute("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND version = '#{version}'").to_a
86
+ result = database_or_connection.exec("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND version = '#{version}'").to_a
87
87
  else
88
- result = database.execute("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}'").to_a
88
+ result = database_or_connection.exec("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}'").to_a
89
89
  end
90
90
 
91
91
  if result.empty?
@@ -123,11 +123,22 @@ module PgBundle
123
123
  make_uninstall(database)
124
124
  end
125
125
 
126
- private
126
+ # create the extension along with it's dependencies in a transaction
127
+ def create_with_dependencies(database)
128
+ return true if created?(database)
127
129
 
128
- # create extension on a given database connection
129
- def create!(con)
130
- con.exec create_stmt
130
+ database.transaction do |con|
131
+ begin
132
+ create_dependencies(con)
133
+ create_or_update!(con)
134
+ rescue PG::UndefinedFile => err
135
+ raise ExtensionNotFound.new(name, version)
136
+ rescue PG::UndefinedObject => err
137
+ raise MissingDependency.new(name, err.message)
138
+ end
139
+ end
140
+
141
+ true
131
142
  end
132
143
 
133
144
  # create the dependency graph on the given connection
@@ -136,14 +147,31 @@ module PgBundle
136
147
  dependencies.each do |_, d|
137
148
  fail CircularDependencyError.new(name, d.name) if d.resolving_dependencies
138
149
  d.create_dependencies(con)
139
- d.create!(con)
150
+ d.create_or_update!(con)
140
151
  end
141
152
  @resolving_dependencies = false
142
153
  end
143
154
 
155
+ # create extension on a given database connection
156
+ def create!(con)
157
+ con.exec create_stmt
158
+ end
159
+
160
+ def create_or_update!(con)
161
+ return true if created?(con)
162
+ if created_any_version?(con)
163
+ con.exec update_stmt
164
+ else
165
+ create!(con)
166
+ end
167
+ true
168
+ end
169
+
170
+
171
+
144
172
  # checks if Extension is already installed at any version thus need ALTER EXTENSION to install
145
- def created_any_version?(database)
146
- result = database.execute("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND installed").to_a
173
+ def created_any_version?(database_or_connection)
174
+ result = database_or_connection.exec("SELECT * FROM pg_available_extension_versions WHERE name ='#{name}' AND installed").to_a
147
175
  if result.empty?
148
176
  false
149
177
  else
@@ -151,6 +179,8 @@ module PgBundle
151
179
  end
152
180
  end
153
181
 
182
+ private
183
+
154
184
  # adds dependencies that are required but not defined yet
155
185
  def add_missing_required_dependencies(database)
156
186
  requires = requires(database)
@@ -199,7 +229,7 @@ module PgBundle
199
229
  # loads the source and runs make install
200
230
  # returns: self
201
231
  def make_install(database, force = false)
202
- return self if installed?(database) && !force
232
+ return self if installed?(database) && (!force || source.nil?)
203
233
 
204
234
  fail SourceNotFound, name if source.nil?
205
235
 
@@ -214,6 +244,10 @@ module PgBundle
214
244
  stmt
215
245
  end
216
246
 
247
+ def update_stmt
248
+ "ALTER EXTENSION #{name} UPDATE TO '#{version}'"
249
+ end
250
+
217
251
  def install_dependencies(database, force = false)
218
252
  begin
219
253
  dependencies.each do |_, d|
@@ -251,7 +285,7 @@ module PgBundle
251
285
  result = true
252
286
  database.execute 'BEGIN'
253
287
  begin
254
- database.execute "ALTER EXTENSION #{name} UPDATE TO '#{version}'"
288
+ database.execute update_stmt
255
289
  rescue PG::UndefinedFile, PG::UndefinedObject => err
256
290
  @error = err.message
257
291
  result = false
@@ -1,3 +1,3 @@
1
1
  module Pgbundle
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.9'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgbundle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manuel Kniep
@@ -185,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
185
  version: '0'
186
186
  requirements: []
187
187
  rubyforge_project:
188
- rubygems_version: 2.2.1
188
+ rubygems_version: 2.2.2
189
189
  signing_key:
190
190
  specification_version: 4
191
191
  summary: bundling postgres extension