pgsync 0.7.1 → 0.7.3

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
  SHA256:
3
- metadata.gz: 042c6ef2c6e17c85523588c23fb7d92dc23c625eeffd9f2988e56e346b6a46ec
4
- data.tar.gz: 567458066a079635a0a887941d0c8da492acacae24f79f44d48195425a397d32
3
+ metadata.gz: b57c0423d780695d7379788efa869966318b23e3d8b9d92c8218ffb4cdee8609
4
+ data.tar.gz: 8e07cdad5a540c72df19ebdcbcc0e1c0e9930b6c4b1eb46f0bf318cada503bdc
5
5
  SHA512:
6
- metadata.gz: c065a560b972175c371552ca69e7824d81d4bd1ebe72ed045ef5a5a59bcc28b738993019ca58231792f711a1f1acae4b42cb7ef68b73de83505c007a015e833d
7
- data.tar.gz: c38db8ae37eca93353a5f354035fcb604e3e423b4b3fd58719b95c955fad7970990549109454f49392133860903d34d6ac0ca477f82ea1824b23435a9ae6db7e
6
+ metadata.gz: b91a30483535b049852ef679fe5944f065db7c56825a147775a904290c4a1e6221bfde512d7509cd475d97e5c8586c1107870cea4f19407782cd2f7caba88fc7
7
+ data.tar.gz: fbd6e09e5231a89824098c193d58f2debd90005df01fa432aff546e72ffc0b7ec6b951a237fb65f09ce640f28f6c660b29c77bc231744378055fe8b53e643b34
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## 0.7.3 (2022-11-09)
2
+
3
+ - Fixed issue with pg 1.4.4
4
+ - Fixed output when `pg_restore` not found
5
+
6
+ ## 0.7.2 (2022-09-19)
7
+
8
+ - Improved error message when a primary key is required
9
+ - Switched to monotonic time
10
+ - Fixed schema sync with Homebrew Postgres 14.5
11
+
1
12
  ## 0.7.1 (2022-07-06)
2
13
 
3
14
  - Fixed random letter data rule generating non-letter
data/README.md CHANGED
@@ -19,7 +19,13 @@ pgsync is a command line tool. To install, run:
19
19
  gem install pgsync
20
20
  ```
21
21
 
22
- This will give you the `pgsync` command. You can also install it with [Homebrew](#homebrew). If installation fails, you may need to install [dependencies](#dependencies).
22
+ This will give you the `pgsync` command. If installation fails, you may need to install [dependencies](#dependencies).
23
+
24
+ You can also install it with Homebrew:
25
+
26
+ ```sh
27
+ brew install pgsync
28
+ ```
23
29
 
24
30
  ## Setup
25
31
 
@@ -347,14 +353,17 @@ Bundler.with_unbundled_env do
347
353
  end
348
354
  ```
349
355
 
350
- ## Homebrew
356
+ ## Docker
351
357
 
352
- On Mac, you can use:
358
+ Get the [Docker image](https://hub.docker.com/r/ankane/pgsync) with:
353
359
 
354
360
  ```sh
355
- brew install ankane/brew/pgsync
361
+ docker pull ankane/pgsync
362
+ alias pgsync="docker run -ti ankane/pgsync"
356
363
  ```
357
364
 
365
+ This will give you the `pgsync` command.
366
+
358
367
  ## Dependencies
359
368
 
360
369
  If installation fails, your system may be missing Ruby or libpq.
@@ -362,7 +371,7 @@ If installation fails, your system may be missing Ruby or libpq.
362
371
  On Mac, run:
363
372
 
364
373
  ```sh
365
- brew install postgresql
374
+ brew install libpq
366
375
  ```
367
376
 
368
377
  On Ubuntu, run:
@@ -386,6 +395,18 @@ gem install specific_install
386
395
  gem specific_install https://github.com/ankane/pgsync.git
387
396
  ```
388
397
 
398
+ With Homebrew, run:
399
+
400
+ ```sh
401
+ brew upgrade pgsync
402
+ ```
403
+
404
+ With Docker, run:
405
+
406
+ ```sh
407
+ docker pull ankane/pgsync
408
+ ```
409
+
389
410
  ## Related Projects
390
411
 
391
412
  Also check out:
@@ -19,11 +19,11 @@ module PgSync
19
19
  end
20
20
 
21
21
  def host
22
- @host ||= conninfo[:host]
22
+ @host ||= dedup_localhost(conninfo[:host])
23
23
  end
24
24
 
25
25
  def port
26
- @port ||= conninfo[:port]
26
+ @port ||= dedup_localhost(conninfo[:port])
27
27
  end
28
28
 
29
29
  def dbname
@@ -189,5 +189,15 @@ module PgSync
189
189
  conn.conninfo_hash
190
190
  end
191
191
  end
192
+
193
+ # for pg 1.4.4
194
+ # https://github.com/ged/ruby-pg/issues/490
195
+ def dedup_localhost(value)
196
+ if conninfo[:host] == "localhost,localhost" && conninfo[:port].to_s.split(",").uniq.size == 1
197
+ value.split(",")[0]
198
+ else
199
+ value
200
+ end
201
+ end
192
202
  end
193
203
  end
@@ -17,6 +17,11 @@ module PgSync
17
17
  raise Error, "Cannot use --preserve with --schema-first or --schema-only"
18
18
  end
19
19
 
20
+ # generate commands before starting spinner
21
+ # for better error output if pg_restore not found
22
+ dump_command = dump_command()
23
+ restore_command = restore_command()
24
+
20
25
  show_spinner = output.tty? && !opts[:debug]
21
26
 
22
27
  if show_spinner
@@ -29,7 +34,7 @@ module PgSync
29
34
  # if spinner, capture lines to show on error
30
35
  lines = []
31
36
  success =
32
- run_command do |line|
37
+ run_command(dump_command, restore_command) do |line|
33
38
  if show_spinner
34
39
  lines << line
35
40
  else
@@ -51,7 +56,7 @@ module PgSync
51
56
 
52
57
  private
53
58
 
54
- def run_command
59
+ def run_command(dump_command, restore_command)
55
60
  err_r, err_w = IO.pipe
56
61
  Open3.pipeline_start(dump_command, restore_command, err: err_w) do |wait_thrs|
57
62
  err_w.close
@@ -62,8 +67,10 @@ module PgSync
62
67
  end
63
68
  end
64
69
 
65
- def pg_restore_version
66
- `pg_restore --version`.lines[0].chomp.split(" ")[-1].split(/[^\d.]/)[0]
70
+ # --if-exists introduced in Postgres 9.4
71
+ # not ideal, but simpler than trying to parse version
72
+ def supports_if_exists?
73
+ `pg_restore --help`.include?("--if-exists")
67
74
  rescue Errno::ENOENT
68
75
  raise Error, "pg_restore not found"
69
76
  end
@@ -80,7 +87,7 @@ module PgSync
80
87
 
81
88
  def restore_command
82
89
  cmd = ["pg_restore", "--verbose", "--no-owner", "--no-acl", "--clean"]
83
- cmd << "--if-exists" if Gem::Version.new(pg_restore_version) >= Gem::Version.new("9.4.0")
90
+ cmd << "--if-exists" if supports_if_exists?
84
91
  cmd.concat(["-d", @destination.url])
85
92
  end
86
93
 
data/lib/pgsync/sync.rb CHANGED
@@ -8,7 +8,7 @@ module PgSync
8
8
  end
9
9
 
10
10
  def perform
11
- started_at = Time.now
11
+ started_at = monotonic_time
12
12
 
13
13
  args = @arguments
14
14
  opts = @options
@@ -129,7 +129,7 @@ module PgSync
129
129
  end
130
130
 
131
131
  def log_completed(started_at)
132
- time = Time.now - started_at
132
+ time = monotonic_time - started_at
133
133
  message = "Completed in #{time.round(1)}s"
134
134
  log colorize(message, :green)
135
135
  end
@@ -189,11 +189,11 @@ module PgSync
189
189
  log message.sub(":spinner", "⠋")
190
190
  end
191
191
 
192
- started_at[task] = Time.now
192
+ started_at[task] = monotonic_time
193
193
  end
194
194
 
195
195
  finish = lambda do |task, i, result|
196
- time = (Time.now - started_at[task]).round(1)
196
+ time = (monotonic_time - started_at[task]).round(1)
197
197
 
198
198
  success = result[:status] == "success"
199
199
 
data/lib/pgsync/task.rb CHANGED
@@ -88,7 +88,7 @@ module PgSync
88
88
 
89
89
  copy_to_command = "COPY (SELECT #{copy_fields} FROM #{quoted_table}#{sql_clause}) TO STDOUT"
90
90
  if opts[:in_batches]
91
- raise Error, "No primary key" if primary_key.empty?
91
+ raise Error, "Primary key required for --in-batches" if primary_key.empty?
92
92
  primary_key = primary_key.first
93
93
 
94
94
  destination.truncate(table) if opts[:truncate]
@@ -125,7 +125,11 @@ module PgSync
125
125
  end
126
126
  end
127
127
  elsif !opts[:truncate] && (opts[:overwrite] || opts[:preserve] || !sql_clause.empty?)
128
- raise Error, "No primary key" if primary_key.empty?
128
+ if primary_key.empty?
129
+ raise Error, "Primary key required for --overwrite" if opts[:overwrite]
130
+ raise Error, "Primary key required for --preserve" if opts[:preserve]
131
+ raise Error, "Primary key required to sync specific rows"
132
+ end
129
133
 
130
134
  # create a temp table
131
135
  temp_table = "pgsync_#{rand(1_000_000_000)}"
data/lib/pgsync/utils.rb CHANGED
@@ -83,5 +83,9 @@ module PgSync
83
83
  def quote_string(s)
84
84
  s.gsub(/\\/, '\&\&').gsub(/'/, "''")
85
85
  end
86
+
87
+ def monotonic_time
88
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
89
+ end
86
90
  end
87
91
  end
@@ -1,3 +1,3 @@
1
1
  module PgSync
2
- VERSION = "0.7.1"
2
+ VERSION = "0.7.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgsync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-06 00:00:00.000000000 Z
11
+ date: 2022-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parallel