pg_online_schema_change 0.7.4 → 0.8.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 +4 -4
- data/.prettierignore +4 -0
- data/.prettierrc +13 -0
- data/.rubocop.yml +204 -75
- data/.rubocop_todo.yml +11 -25
- data/.ruby-version +1 -1
- data/CHANGELOG.md +38 -20
- data/CODE_OF_CONDUCT.md +11 -11
- data/Gemfile.lock +73 -42
- data/README.md +40 -24
- data/Rakefile +1 -1
- data/docker-compose.yml +2 -2
- data/docs/load-test.md +11 -10
- data/lib/pg_online_schema_change/cli.rb +87 -23
- data/lib/pg_online_schema_change/client.rb +24 -12
- data/lib/pg_online_schema_change/helper.rb +1 -1
- data/lib/pg_online_schema_change/orchestrate.rb +78 -40
- data/lib/pg_online_schema_change/query.rb +148 -95
- data/lib/pg_online_schema_change/replay.rb +10 -20
- data/lib/pg_online_schema_change/version.rb +1 -1
- data/lib/pg_online_schema_change.rb +15 -9
- data/package.json +13 -0
- data/yarn.lock +15 -0
- metadata +96 -36
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
4
|
-
|
5
3
|
module PgOnlineSchemaChange
|
6
4
|
class Replay
|
7
5
|
extend Helper
|
@@ -29,7 +27,9 @@ module PgOnlineSchemaChange
|
|
29
27
|
SQL
|
30
28
|
|
31
29
|
rows = []
|
32
|
-
Query.run(client.connection, select_query, reuse_trasaction)
|
30
|
+
Query.run(client.connection, select_query, reuse_trasaction) do |result|
|
31
|
+
rows = result.map { |row| row }
|
32
|
+
end
|
33
33
|
|
34
34
|
rows
|
35
35
|
end
|
@@ -48,14 +48,10 @@ module PgOnlineSchemaChange
|
|
48
48
|
|
49
49
|
# Remove audit table cols, since we will be
|
50
50
|
# re-mapping them for inserts and updates
|
51
|
-
reserved_columns.each
|
52
|
-
new_row.delete(col)
|
53
|
-
end
|
51
|
+
reserved_columns.each { |col| new_row.delete(col) }
|
54
52
|
|
55
53
|
if dropped_columns_list.any?
|
56
|
-
dropped_columns_list.each
|
57
|
-
new_row.delete(dropped_column)
|
58
|
-
end
|
54
|
+
dropped_columns_list.each { |dropped_column| new_row.delete(dropped_column) }
|
59
55
|
end
|
60
56
|
|
61
57
|
if renamed_columns_list.any?
|
@@ -69,13 +65,9 @@ module PgOnlineSchemaChange
|
|
69
65
|
|
70
66
|
# quote indent column to preserve case insensitivity
|
71
67
|
# ensure rows are escaped
|
72
|
-
new_row = new_row.transform_keys
|
73
|
-
client.connection.quote_ident(column)
|
74
|
-
end
|
68
|
+
new_row = new_row.transform_keys { |column| client.connection.quote_ident(column) }
|
75
69
|
|
76
|
-
new_row = new_row.transform_values
|
77
|
-
client.connection.escape_string(value)
|
78
|
-
end
|
70
|
+
new_row = new_row.transform_values { |value| client.connection.escape_string(value) }
|
79
71
|
|
80
72
|
case row[operation_type_column]
|
81
73
|
when "INSERT"
|
@@ -89,21 +81,19 @@ module PgOnlineSchemaChange
|
|
89
81
|
|
90
82
|
to_be_deleted_rows << "'#{row[audit_table_pk]}'"
|
91
83
|
when "UPDATE"
|
92
|
-
set_values = new_row.map
|
93
|
-
"#{column} = '#{value}'"
|
94
|
-
end.join(",")
|
84
|
+
set_values = new_row.map { |column, value| "#{column} = '#{value}'" }.join(",")
|
95
85
|
|
96
86
|
sql = <<~SQL
|
97
87
|
UPDATE #{shadow_table}
|
98
88
|
SET #{set_values}
|
99
|
-
WHERE #{primary_key}
|
89
|
+
WHERE #{primary_key}='#{row[primary_key]}';
|
100
90
|
SQL
|
101
91
|
to_be_replayed << sql
|
102
92
|
|
103
93
|
to_be_deleted_rows << "'#{row[audit_table_pk]}'"
|
104
94
|
when "DELETE"
|
105
95
|
sql = <<~SQL
|
106
|
-
DELETE FROM #{shadow_table} WHERE #{primary_key}
|
96
|
+
DELETE FROM #{shadow_table} WHERE #{primary_key}='#{row[primary_key]}';
|
107
97
|
SQL
|
108
98
|
to_be_replayed << sql
|
109
99
|
|
@@ -14,16 +14,22 @@ require "pg_online_schema_change/orchestrate"
|
|
14
14
|
require "pg_online_schema_change/cli"
|
15
15
|
|
16
16
|
module PgOnlineSchemaChange
|
17
|
-
class Error < StandardError
|
18
|
-
|
19
|
-
|
17
|
+
class Error < StandardError
|
18
|
+
end
|
19
|
+
|
20
|
+
class CountBelowDelta < StandardError
|
21
|
+
end
|
22
|
+
|
23
|
+
class AccessExclusiveLockNotAcquired < StandardError
|
24
|
+
end
|
20
25
|
|
21
26
|
def self.logger(verbose: false)
|
22
|
-
@logger ||=
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
@logger ||=
|
28
|
+
begin
|
29
|
+
logger = Ougai::Logger.new($stdout)
|
30
|
+
logger.level = verbose ? Ougai::Logger::TRACE : Ougai::Logger::INFO
|
31
|
+
logger.with_fields = { version: PgOnlineSchemaChange::VERSION }
|
32
|
+
logger
|
33
|
+
end
|
28
34
|
end
|
29
35
|
end
|
data/package.json
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"name": "pg-osc",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"main": "index.js",
|
5
|
+
"repository": "git@github.com:shayonj/pg-osc.git",
|
6
|
+
"author": "Shayon Mukherjee <shayonj@gmail.com>",
|
7
|
+
"license": "MIT",
|
8
|
+
"private": true,
|
9
|
+
"dependencies": {
|
10
|
+
"@prettier/plugin-ruby": "^3.2.2",
|
11
|
+
"prettier": "^2.8.8"
|
12
|
+
}
|
13
|
+
}
|
data/yarn.lock
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
2
|
+
# yarn lockfile v1
|
3
|
+
|
4
|
+
|
5
|
+
"@prettier/plugin-ruby@^3.2.2":
|
6
|
+
version "3.2.2"
|
7
|
+
resolved "https://registry.yarnpkg.com/@prettier/plugin-ruby/-/plugin-ruby-3.2.2.tgz#43c9d85349032f74d34c4f57e6a77487d5c5bdc1"
|
8
|
+
integrity sha512-Vc7jVE39Fgswl517ET4kPtpnoRWE6XTi1Sivd84rZyomYnHYUmvUsEeoOf6tVhzTuIXE5XVQB1YCG2hulrwR3Q==
|
9
|
+
dependencies:
|
10
|
+
prettier ">=2.3.0"
|
11
|
+
|
12
|
+
prettier@>=2.3.0, prettier@^2.8.8:
|
13
|
+
version "2.8.8"
|
14
|
+
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
|
15
|
+
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_online_schema_change
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shayon Mukherjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ougai
|
@@ -66,118 +66,174 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.2.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: prettier_print
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: pry
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0
|
89
|
+
version: '0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rake
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- - "
|
101
|
+
- - ">="
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
103
|
+
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- - "
|
108
|
+
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rspec
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
|
-
- - "
|
115
|
+
- - ">="
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
117
|
+
version: '0'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
|
-
- - "
|
122
|
+
- - ">="
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rubocop
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
|
-
- - "
|
129
|
+
- - ">="
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
131
|
+
version: '0'
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
|
-
- - "
|
136
|
+
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
138
|
+
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rubocop-packaging
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
|
-
- - "
|
143
|
+
- - ">="
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0
|
145
|
+
version: '0'
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
|
-
- - "
|
150
|
+
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: rubocop-performance
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
|
-
- - "
|
157
|
+
- - ">="
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
159
|
+
version: '0'
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
|
-
- - "
|
164
|
+
- - ">="
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
166
|
+
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: rubocop-rake
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
156
170
|
requirements:
|
157
|
-
- - "
|
171
|
+
- - ">="
|
158
172
|
- !ruby/object:Gem::Version
|
159
|
-
version: 0
|
173
|
+
version: '0'
|
160
174
|
type: :development
|
161
175
|
prerelease: false
|
162
176
|
version_requirements: !ruby/object:Gem::Requirement
|
163
177
|
requirements:
|
164
|
-
- - "
|
178
|
+
- - ">="
|
165
179
|
- !ruby/object:Gem::Version
|
166
|
-
version: 0
|
180
|
+
version: '0'
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: rubocop-rspec
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
170
184
|
requirements:
|
171
|
-
- - "
|
185
|
+
- - ">="
|
172
186
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
187
|
+
version: '0'
|
174
188
|
type: :development
|
175
189
|
prerelease: false
|
176
190
|
version_requirements: !ruby/object:Gem::Requirement
|
177
191
|
requirements:
|
178
|
-
- - "
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: syntax_tree
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: syntax_tree-haml
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: syntax_tree-rbs
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
179
235
|
- !ruby/object:Gem::Version
|
180
|
-
version:
|
236
|
+
version: '0'
|
181
237
|
description: Easy CLI tool for making non-blocking zero downtime schema changes in
|
182
238
|
PostgreSQL
|
183
239
|
email:
|
@@ -189,6 +245,8 @@ executables:
|
|
189
245
|
extensions: []
|
190
246
|
extra_rdoc_files: []
|
191
247
|
files:
|
248
|
+
- ".prettierignore"
|
249
|
+
- ".prettierrc"
|
192
250
|
- ".rspec"
|
193
251
|
- ".rubocop.yml"
|
194
252
|
- ".rubocop_todo.yml"
|
@@ -219,7 +277,9 @@ files:
|
|
219
277
|
- lib/pg_online_schema_change/replay.rb
|
220
278
|
- lib/pg_online_schema_change/store.rb
|
221
279
|
- lib/pg_online_schema_change/version.rb
|
280
|
+
- package.json
|
222
281
|
- scripts/release.sh
|
282
|
+
- yarn.lock
|
223
283
|
homepage: https://github.com/shayonj/pg-osc
|
224
284
|
licenses:
|
225
285
|
- MIT
|
@@ -233,14 +293,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
233
293
|
requirements:
|
234
294
|
- - ">="
|
235
295
|
- !ruby/object:Gem::Version
|
236
|
-
version: 2.
|
296
|
+
version: 2.7.0
|
237
297
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
238
298
|
requirements:
|
239
299
|
- - ">="
|
240
300
|
- !ruby/object:Gem::Version
|
241
301
|
version: '0'
|
242
302
|
requirements: []
|
243
|
-
rubygems_version: 3.
|
303
|
+
rubygems_version: 3.3.26
|
244
304
|
signing_key:
|
245
305
|
specification_version: 4
|
246
306
|
summary: Easy CLI tool for making non-blocking zero downtime schema changes in PostgreSQL
|