pg_easy_replicate 0.1.8 → 0.1.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 +4 -4
- data/Gemfile.lock +5 -5
- data/docker-compose.yml +4 -4
- data/lib/pg_easy_replicate/helper.rb +4 -0
- data/lib/pg_easy_replicate/orchestrate.rb +14 -6
- data/lib/pg_easy_replicate/query.rb +2 -2
- data/lib/pg_easy_replicate/version.rb +1 -1
- data/lib/pg_easy_replicate.rb +14 -12
- data/scripts/e2e-bootstrap.sh +5 -5
- data/scripts/e2e-start.sh +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02ca1ab51b854644e7a44fcb9a166a363b608784f4c38a6872cc6be5d35b21f3
|
4
|
+
data.tar.gz: dfb7b875e61b5c032940af84417ce7cf35b75897039ba4efd400513d7da5de20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 698b38142b8f8a8c9a64623d9a3bb06791a3a5bc174c4abffc49a480787d6cf33a002b75e9e6a61c23f443c962818544ef3c98fab5970bc1bccf1224ebaa8cb6
|
7
|
+
data.tar.gz: f6942a91cade0e60c9c5e245f4cabe9a7d0e698316855c7eacbd53bc1b2769a3d465e12dc7e1cda34f10149b24b3bfde35a585ab6b8583f9645b9faae5439021
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pg_easy_replicate (0.1.
|
4
|
+
pg_easy_replicate (0.1.9)
|
5
5
|
ougai (~> 2.0.0)
|
6
6
|
pg (~> 1.5.3)
|
7
7
|
sequel (>= 5.69, < 5.71)
|
@@ -37,7 +37,7 @@ GEM
|
|
37
37
|
rake (13.0.6)
|
38
38
|
rbs (3.1.0)
|
39
39
|
regexp_parser (2.8.1)
|
40
|
-
rexml (3.2.
|
40
|
+
rexml (3.2.6)
|
41
41
|
rspec (3.12.0)
|
42
42
|
rspec-core (~> 3.12.0)
|
43
43
|
rspec-expectations (~> 3.12.0)
|
@@ -51,7 +51,7 @@ GEM
|
|
51
51
|
diff-lcs (>= 1.2.0, < 2.0)
|
52
52
|
rspec-support (~> 3.12.0)
|
53
53
|
rspec-support (3.12.0)
|
54
|
-
rubocop (1.
|
54
|
+
rubocop (1.55.0)
|
55
55
|
json (~> 2.3)
|
56
56
|
language_server-protocol (>= 3.17.0)
|
57
57
|
parallel (~> 1.10)
|
@@ -59,7 +59,7 @@ GEM
|
|
59
59
|
rainbow (>= 2.2.2, < 4.0)
|
60
60
|
regexp_parser (>= 1.8, < 3.0)
|
61
61
|
rexml (>= 3.2.5, < 4.0)
|
62
|
-
rubocop-ast (>= 1.28.
|
62
|
+
rubocop-ast (>= 1.28.1, < 2.0)
|
63
63
|
ruby-progressbar (~> 1.7)
|
64
64
|
unicode-display_width (>= 2.4.0, < 3.0)
|
65
65
|
rubocop-ast (1.29.0)
|
@@ -75,7 +75,7 @@ GEM
|
|
75
75
|
rubocop-ast (>= 0.4.0)
|
76
76
|
rubocop-rake (0.6.0)
|
77
77
|
rubocop (~> 1.0)
|
78
|
-
rubocop-rspec (2.
|
78
|
+
rubocop-rspec (2.23.0)
|
79
79
|
rubocop (~> 1.33)
|
80
80
|
rubocop-capybara (~> 2.17)
|
81
81
|
rubocop-factory_bot (~> 2.22)
|
data/docker-compose.yml
CHANGED
@@ -5,8 +5,8 @@ services:
|
|
5
5
|
ports:
|
6
6
|
- "5432:5432"
|
7
7
|
environment:
|
8
|
-
POSTGRES_USER:
|
9
|
-
POSTGRES_PASSWORD:
|
8
|
+
POSTGRES_USER: james-bond
|
9
|
+
POSTGRES_PASSWORD: james-bond123@7!'3aaR
|
10
10
|
POSTGRES_DB: postgres
|
11
11
|
command: >
|
12
12
|
-c wal_level=logical
|
@@ -21,8 +21,8 @@ services:
|
|
21
21
|
ports:
|
22
22
|
- "5433:5432"
|
23
23
|
environment:
|
24
|
-
POSTGRES_USER:
|
25
|
-
POSTGRES_PASSWORD:
|
24
|
+
POSTGRES_USER: james-bond
|
25
|
+
POSTGRES_PASSWORD: james-bond123@7!'3aaR
|
26
26
|
POSTGRES_DB: postgres
|
27
27
|
command: >
|
28
28
|
-c wal_level=logical
|
@@ -94,7 +94,8 @@ module PgEasyReplicate
|
|
94
94
|
.map do |table_name|
|
95
95
|
Query.run(
|
96
96
|
query:
|
97
|
-
"ALTER PUBLICATION #{publication_name(group_name)}
|
97
|
+
"ALTER PUBLICATION #{quote_ident(publication_name(group_name))}
|
98
|
+
ADD TABLE #{quote_ident(table_name)}",
|
98
99
|
connection_url: conn_string,
|
99
100
|
schema: schema,
|
100
101
|
)
|
@@ -107,7 +108,11 @@ module PgEasyReplicate
|
|
107
108
|
Query
|
108
109
|
.run(
|
109
110
|
query:
|
110
|
-
"SELECT table_name
|
111
|
+
"SELECT table_name
|
112
|
+
FROM information_schema.tables
|
113
|
+
WHERE table_schema = '#{schema}' AND
|
114
|
+
table_type = 'BASE TABLE'
|
115
|
+
ORDER BY table_name",
|
111
116
|
connection_url: conn_string,
|
112
117
|
)
|
113
118
|
.map(&:values)
|
@@ -121,7 +126,8 @@ module PgEasyReplicate
|
|
121
126
|
{ publication_name: publication_name(group_name) },
|
122
127
|
)
|
123
128
|
Query.run(
|
124
|
-
query:
|
129
|
+
query:
|
130
|
+
"DROP PUBLICATION IF EXISTS #{quote_ident(publication_name(group_name))}",
|
125
131
|
connection_url: conn_string,
|
126
132
|
user: db_user(conn_string),
|
127
133
|
)
|
@@ -144,7 +150,9 @@ module PgEasyReplicate
|
|
144
150
|
|
145
151
|
Query.run(
|
146
152
|
query:
|
147
|
-
"CREATE SUBSCRIPTION #{subscription_name(group_name)
|
153
|
+
"CREATE SUBSCRIPTION #{quote_ident(subscription_name(group_name))}
|
154
|
+
CONNECTION '#{source_conn_string}'
|
155
|
+
PUBLICATION #{quote_ident(publication_name(group_name))}",
|
148
156
|
connection_url: target_conn_string,
|
149
157
|
user: db_user(target_conn_string),
|
150
158
|
transaction: false,
|
@@ -282,7 +290,7 @@ module PgEasyReplicate
|
|
282
290
|
)
|
283
291
|
|
284
292
|
alter_sql =
|
285
|
-
"ALTER USER #{db_user(source_db_url)} set default_transaction_read_only = true"
|
293
|
+
"ALTER USER #{quote_ident(db_user(source_db_url))} set default_transaction_read_only = true"
|
286
294
|
Query.run(query: alter_sql, connection_url: source_db_url)
|
287
295
|
|
288
296
|
kill_sql =
|
@@ -297,7 +305,7 @@ module PgEasyReplicate
|
|
297
305
|
logger.info("Restoring connections")
|
298
306
|
|
299
307
|
alter_sql =
|
300
|
-
"ALTER USER #{db_user(source_db_url)} set default_transaction_read_only = false"
|
308
|
+
"ALTER USER #{quote_ident(db_user(source_db_url))} set default_transaction_read_only = false"
|
301
309
|
Query.run(query: alter_sql, connection_url: source_db_url)
|
302
310
|
end
|
303
311
|
|
@@ -17,12 +17,12 @@ module PgEasyReplicate
|
|
17
17
|
if transaction
|
18
18
|
r =
|
19
19
|
conn.transaction do
|
20
|
-
conn.run("SET search_path to #{schema}") if schema
|
20
|
+
conn.run("SET search_path to #{quote_ident(schema)}") if schema
|
21
21
|
conn.run("SET statement_timeout to '5s'")
|
22
22
|
conn.fetch(query).to_a
|
23
23
|
end
|
24
24
|
else
|
25
|
-
conn.run("SET search_path to #{schema}") if schema
|
25
|
+
conn.run("SET search_path to #{quote_ident(schema)}") if schema
|
26
26
|
conn.run("SET statement_timeout to '5s'")
|
27
27
|
r = conn.fetch(query).to_a
|
28
28
|
end
|
data/lib/pg_easy_replicate.rb
CHANGED
@@ -5,6 +5,7 @@ require "ougai"
|
|
5
5
|
require "pg"
|
6
6
|
require "sequel"
|
7
7
|
require "open3"
|
8
|
+
require "English"
|
8
9
|
|
9
10
|
require "pg_easy_replicate/helper"
|
10
11
|
require "pg_easy_replicate/version"
|
@@ -152,7 +153,8 @@ module PgEasyReplicate
|
|
152
153
|
|
153
154
|
def drop_internal_schema
|
154
155
|
Query.run(
|
155
|
-
query:
|
156
|
+
query:
|
157
|
+
"DROP SCHEMA IF EXISTS #{quote_ident(internal_schema_name)} CASCADE",
|
156
158
|
connection_url: source_db_url,
|
157
159
|
schema: internal_schema_name,
|
158
160
|
user: db_user(target_db_url),
|
@@ -163,9 +165,9 @@ module PgEasyReplicate
|
|
163
165
|
|
164
166
|
def setup_internal_schema
|
165
167
|
sql = <<~SQL
|
166
|
-
create schema if not exists #{internal_schema_name};
|
167
|
-
grant usage on schema #{internal_schema_name} to #{db_user(source_db_url)};
|
168
|
-
grant create on schema #{internal_schema_name} to #{db_user(source_db_url)};
|
168
|
+
create schema if not exists #{quote_ident(internal_schema_name)};
|
169
|
+
grant usage on schema #{quote_ident(internal_schema_name)} to #{quote_ident(db_user(source_db_url))};
|
170
|
+
grant create on schema #{quote_ident(internal_schema_name)} to #{quote_ident(db_user(source_db_url))};
|
169
171
|
SQL
|
170
172
|
|
171
173
|
Query.run(
|
@@ -273,9 +275,9 @@ module PgEasyReplicate
|
|
273
275
|
password = connection_info(conn_string)[:password].gsub("'") { "''" }
|
274
276
|
|
275
277
|
sql = <<~SQL
|
276
|
-
drop role if exists #{internal_user_name};
|
277
|
-
create role #{internal_user_name} with password '#{password}' login createdb createrole;
|
278
|
-
grant all privileges on database #{db_name(conn_string)} TO #{internal_user_name};
|
278
|
+
drop role if exists #{quote_ident(internal_user_name)};
|
279
|
+
create role #{quote_ident(internal_user_name)} with password '#{password}' login createdb createrole;
|
280
|
+
grant all privileges on database #{quote_ident(db_name(conn_string))} TO #{quote_ident(internal_user_name)};
|
279
281
|
SQL
|
280
282
|
|
281
283
|
Query.run(
|
@@ -287,9 +289,9 @@ module PgEasyReplicate
|
|
287
289
|
|
288
290
|
sql =
|
289
291
|
if special_user_role
|
290
|
-
"grant #{special_user_role} to #{internal_user_name};"
|
292
|
+
"grant #{quote_ident(special_user_role)} to #{quote_ident(internal_user_name)};"
|
291
293
|
else
|
292
|
-
"alter user #{internal_user_name} with superuser;"
|
294
|
+
"alter user #{quote_ident(internal_user_name)} with superuser;"
|
293
295
|
end
|
294
296
|
|
295
297
|
Query.run(
|
@@ -302,7 +304,7 @@ module PgEasyReplicate
|
|
302
304
|
return unless grant_permissions_on_schema
|
303
305
|
Query.run(
|
304
306
|
query:
|
305
|
-
"grant all on schema #{internal_schema_name} to #{internal_user_name}",
|
307
|
+
"grant all on schema #{quote_ident(internal_schema_name)} to #{quote_ident(internal_user_name)}",
|
306
308
|
connection_url: conn_string,
|
307
309
|
user: db_user(conn_string),
|
308
310
|
transaction: false,
|
@@ -313,7 +315,7 @@ module PgEasyReplicate
|
|
313
315
|
|
314
316
|
def drop_user(conn_string:, group_name:)
|
315
317
|
sql = <<~SQL
|
316
|
-
revoke all privileges on database #{db_name(conn_string)} from #{internal_user_name};
|
318
|
+
revoke all privileges on database #{db_name(conn_string)} from #{quote_ident(internal_user_name)};
|
317
319
|
SQL
|
318
320
|
Query.run(
|
319
321
|
query: sql,
|
@@ -322,7 +324,7 @@ module PgEasyReplicate
|
|
322
324
|
)
|
323
325
|
|
324
326
|
sql = <<~SQL
|
325
|
-
drop role if exists #{internal_user_name};
|
327
|
+
drop role if exists #{quote_ident(internal_user_name)};
|
326
328
|
SQL
|
327
329
|
|
328
330
|
Query.run(
|
data/scripts/e2e-bootstrap.sh
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
set -eo pipefail
|
4
4
|
|
5
5
|
if [[ -z ${GITHUB_WORKFLOW} ]]; then
|
6
|
-
export SECONDARY_SOURCE_DB_URL="postgres://
|
6
|
+
export SECONDARY_SOURCE_DB_URL="postgres://james-bond:james-bond123%407%21%273aaR@source_db/postgres"
|
7
7
|
fi
|
8
8
|
|
9
|
-
export SOURCE_DB_URL="postgres://
|
10
|
-
export TARGET_DB_URL="postgres://
|
11
|
-
export PGPASSWORD='
|
9
|
+
export SOURCE_DB_URL="postgres://james-bond:james-bond123%407%21%273aaR@localhost:5432/postgres"
|
10
|
+
export TARGET_DB_URL="postgres://james-bond:james-bond123%407%21%273aaR@localhost:5433/postgres"
|
11
|
+
export PGPASSWORD='james-bond123@7!'"'"'3aaR'
|
12
12
|
|
13
|
-
pgbench --initialize -s 5 --foreign-keys --host localhost -U
|
13
|
+
pgbench --initialize -s 5 --foreign-keys --host localhost -U james-bond -d postgres
|
14
14
|
|
15
15
|
bundle exec bin/pg_easy_replicate config_check --copy-schema
|
data/scripts/e2e-start.sh
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
set -eo pipefail
|
4
4
|
|
5
5
|
if [[ -z ${GITHUB_WORKFLOW} ]]; then
|
6
|
-
export SECONDARY_SOURCE_DB_URL="postgres://
|
6
|
+
export SECONDARY_SOURCE_DB_URL="postgres://james-bond:james-bond123%407%21%273aaR@source_db/postgres"
|
7
7
|
fi
|
8
8
|
|
9
|
-
export SOURCE_DB_URL="postgres://
|
10
|
-
export TARGET_DB_URL="postgres://
|
11
|
-
export PGPASSWORD='
|
9
|
+
export SOURCE_DB_URL="postgres://james-bond:james-bond123%407%21%273aaR@localhost:5432/postgres"
|
10
|
+
export TARGET_DB_URL="postgres://james-bond:james-bond123%407%21%273aaR@localhost:5433/postgres"
|
11
|
+
export PGPASSWORD='james-bond123@7!'"'"''"'"'3aaR'
|
12
12
|
|
13
13
|
# Bootstrap and cleanup
|
14
14
|
echo "===== Performing Bootstrap and cleanup"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_easy_replicate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shayon Mukherjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ougai
|