pg_easy_replicate 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|