pg_export 1.0.0.rc5 → 1.0.0.rc6
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/.rubocop.yml +19 -4
- data/CHANGELOG.md +7 -5
- data/README.md +46 -24
- data/bin/pg_export +27 -29
- data/lib/pg_export/configuration.rb +70 -18
- data/lib/pg_export/factory.rb +148 -0
- data/lib/pg_export/lib/pg_export/adapters/{bash_adapter.rb → shell_adapter.rb} +1 -1
- data/lib/pg_export/lib/pg_export/entities/dump.rb +22 -10
- data/lib/pg_export/lib/pg_export/factories/cipher_factory.rb +8 -4
- data/lib/pg_export/lib/pg_export/factories/dump_factory.rb +0 -1
- data/lib/pg_export/lib/pg_export/factories/ftp_gateway_factory.rb +7 -4
- data/lib/pg_export/lib/pg_export/factories/ssh_gateway_factory.rb +7 -4
- data/lib/pg_export/lib/pg_export/gateways/ftp.rb +1 -3
- data/lib/pg_export/lib/pg_export/gateways/ssh.rb +2 -6
- data/lib/pg_export/lib/pg_export/listeners/interactive/build_dump.rb +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/close_connection.rb +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps.rb +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/restore.rb +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/upload_dump.rb +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive_listener.rb +4 -3
- data/lib/pg_export/lib/pg_export/listeners/plain/prepare_params.rb +1 -1
- data/lib/pg_export/lib/pg_export/listeners/plain_listener.rb +11 -5
- data/lib/pg_export/lib/pg_export/operations/decrypt_dump.rb +16 -6
- data/lib/pg_export/lib/pg_export/operations/encrypt_dump.rb +14 -5
- data/lib/pg_export/lib/pg_export/operations/open_connection.rb +14 -5
- data/lib/pg_export/lib/pg_export/operations/remove_old_dumps.rb +14 -6
- data/lib/pg_export/lib/pg_export/repositories/gateway_dump_file_repository.rb +0 -1
- data/lib/pg_export/lib/pg_export/repositories/gateway_dump_repository.rb +2 -7
- data/lib/pg_export/lib/pg_export/transactions/evaluator.rb +59 -0
- data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +27 -21
- data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +31 -29
- data/lib/pg_export/lib/pg_export/value_objects/dump_file.rb +2 -2
- data/lib/pg_export/lib/pg_export/value_objects/result.rb +49 -0
- data/lib/pg_export/version.rb +1 -1
- data/lib/pg_export.rb +13 -8
- data/pg_export.gemspec +1 -6
- metadata +13 -89
- data/lib/pg_export/container.rb +0 -23
- data/lib/pg_export/import.rb +0 -7
- data/lib/pg_export/lib/pg_export/types.rb +0 -14
- data/lib/pg_export/system/boot/config.rb +0 -27
- data/lib/pg_export/system/boot/ftp.rb +0 -11
- data/lib/pg_export/system/boot/interactive.rb +0 -16
- data/lib/pg_export/system/boot/operations.rb +0 -17
- data/lib/pg_export/system/boot/plain.rb +0 -16
- data/lib/pg_export/system/boot/ssh.rb +0 -11
@@ -1,14 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# auto_register: false
|
4
|
-
|
5
3
|
require 'pg_export/lib/pg_export/gateways/ftp'
|
6
|
-
require 'pg_export/import'
|
7
4
|
|
8
5
|
class PgExport
|
9
6
|
module Factories
|
10
7
|
class FtpGatewayFactory
|
11
|
-
|
8
|
+
def initialize(config:)
|
9
|
+
@config = config
|
10
|
+
end
|
12
11
|
|
13
12
|
def gateway
|
14
13
|
::PgExport::Gateways::Ftp.new(
|
@@ -17,6 +16,10 @@ class PgExport
|
|
17
16
|
password: config.gateway_password
|
18
17
|
)
|
19
18
|
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :config
|
20
23
|
end
|
21
24
|
end
|
22
25
|
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# auto_register: false
|
4
|
-
|
5
3
|
require 'pg_export/lib/pg_export/gateways/ssh'
|
6
|
-
require 'pg_export/import'
|
7
4
|
|
8
5
|
class PgExport
|
9
6
|
module Factories
|
10
7
|
class SshGatewayFactory
|
11
|
-
|
8
|
+
def initialize(config:)
|
9
|
+
@config = config
|
10
|
+
end
|
12
11
|
|
13
12
|
def gateway
|
14
13
|
::PgExport::Gateways::Ssh.new(
|
@@ -17,6 +16,10 @@ class PgExport
|
|
17
16
|
password: config.gateway_password
|
18
17
|
)
|
19
18
|
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :config
|
20
23
|
end
|
21
24
|
end
|
22
25
|
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# auto_register: false
|
4
|
-
|
5
3
|
require 'net/ftp'
|
6
4
|
|
7
5
|
class PgExport
|
8
6
|
module Gateways
|
9
7
|
class Ftp
|
10
|
-
CHUNK_SIZE = (2**16)
|
8
|
+
CHUNK_SIZE = (2**16)
|
11
9
|
|
12
10
|
def initialize(host:, user:, password:)
|
13
11
|
@host, @user, @password, @logger = host, user, password
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# auto_register: false
|
4
|
-
|
5
3
|
require 'ed25519'
|
6
4
|
require 'net/ssh'
|
7
5
|
require 'net/scp'
|
@@ -9,8 +7,6 @@ require 'net/scp'
|
|
9
7
|
class PgExport
|
10
8
|
module Gateways
|
11
9
|
class Ssh
|
12
|
-
CHUNK_SIZE = (2**16).freeze
|
13
|
-
|
14
10
|
def initialize(host:, user:, password:)
|
15
11
|
@host, @user, @password, @logger = host, user, password
|
16
12
|
end
|
@@ -25,7 +21,7 @@ class PgExport
|
|
25
21
|
end
|
26
22
|
|
27
23
|
def welcome
|
28
|
-
open.exec!('hostname')
|
24
|
+
open.exec!('hostname; whoami')
|
29
25
|
end
|
30
26
|
|
31
27
|
def close
|
@@ -49,7 +45,7 @@ class PgExport
|
|
49
45
|
end
|
50
46
|
|
51
47
|
def delete(name)
|
52
|
-
#
|
48
|
+
ssh.exec!("rm #{name}")
|
53
49
|
end
|
54
50
|
|
55
51
|
def persist(file, name)
|
@@ -7,7 +7,7 @@ class PgExport
|
|
7
7
|
class Interactive
|
8
8
|
class BuildDump < InteractiveListener
|
9
9
|
def on_step(event)
|
10
|
-
@spinner = build_spinner("Dumping database #{event[:
|
10
|
+
@spinner = build_spinner("Dumping database #{event[:value][:database_name]}")
|
11
11
|
end
|
12
12
|
|
13
13
|
def on_step_succeeded(event)
|
@@ -7,7 +7,7 @@ class PgExport
|
|
7
7
|
class Interactive
|
8
8
|
class RemoveOldDumps < InteractiveListener
|
9
9
|
def on_step(event)
|
10
|
-
@spinner = build_spinner("Checking for old dumps on #{event[:
|
10
|
+
@spinner = build_spinner("Checking for old dumps on #{event[:value][:gateway]}")
|
11
11
|
end
|
12
12
|
|
13
13
|
def on_step_succeeded(event)
|
@@ -7,7 +7,7 @@ class PgExport
|
|
7
7
|
class Interactive
|
8
8
|
class Restore < InteractiveListener
|
9
9
|
def on_step(event)
|
10
|
-
@spinner = build_spinner("Restoring dump to database #{event[:
|
10
|
+
@spinner = build_spinner("Restoring dump to database #{event[:value][:database]}")
|
11
11
|
end
|
12
12
|
|
13
13
|
def on_step_succeeded(*)
|
@@ -7,7 +7,7 @@ class PgExport
|
|
7
7
|
class Interactive
|
8
8
|
class UploadDump < InteractiveListener
|
9
9
|
def on_step(event)
|
10
|
-
@spinner = build_spinner("Uploading #{event[:
|
10
|
+
@spinner = build_spinner("Uploading #{event[:value][:dump]} to #{event[:value][:gateway]}")
|
11
11
|
end
|
12
12
|
|
13
13
|
def on_step_succeeded(*)
|
@@ -1,13 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# auto_register: false
|
4
|
-
|
5
|
-
require 'pg_export/import'
|
6
3
|
require 'tty-spinner'
|
7
4
|
|
8
5
|
class PgExport
|
9
6
|
module Listeners
|
10
7
|
class InteractiveListener
|
8
|
+
def on_step(*); end
|
9
|
+
|
10
|
+
def on_step_succeeded(*); end
|
11
|
+
|
11
12
|
def on_step_failed(event)
|
12
13
|
@spinner.error([error, self.class.red(event[:value][:message])].join("\n"))
|
13
14
|
end
|
@@ -1,17 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# auto_register: false
|
4
|
-
|
5
|
-
require 'pg_export/import'
|
6
|
-
|
7
3
|
class PgExport
|
8
4
|
module Listeners
|
9
5
|
class PlainListener
|
10
|
-
|
6
|
+
def initialize(logger:)
|
7
|
+
@logger = logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def on_step(*); end
|
11
|
+
|
12
|
+
def on_step_succeeded(*); end
|
11
13
|
|
12
14
|
def on_step_failed(event)
|
13
15
|
logger.info("Error: #{event[:value][:message]}")
|
14
16
|
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :logger
|
15
21
|
end
|
16
22
|
end
|
17
23
|
end
|
@@ -1,20 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'pg_export/
|
3
|
+
require 'pg_export'
|
4
|
+
require 'pg_export/lib/pg_export/value_objects/result'
|
5
5
|
|
6
6
|
class PgExport
|
7
7
|
module Operations
|
8
8
|
class DecryptDump
|
9
|
-
|
10
|
-
|
9
|
+
def initialize(cipher_factory:)
|
10
|
+
@cipher_factory = cipher_factory
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
:decrypt_dump
|
15
|
+
end
|
11
16
|
|
12
17
|
def call(dump:)
|
13
18
|
dump.decrypt(cipher_factory: cipher_factory)
|
14
|
-
|
19
|
+
|
20
|
+
ValueObjects::Success.new(dump: dump)
|
15
21
|
rescue OpenSSL::Cipher::CipherError => e
|
16
|
-
Failure(message: "Problem decrypting dump file: #{e}. Try again.")
|
22
|
+
ValueObjects::Failure.new(message: "Problem decrypting dump file: #{e}. Try again.")
|
17
23
|
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :cipher_factory
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
@@ -1,18 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'pg_export/import'
|
3
|
+
require 'pg_export/lib/pg_export/value_objects/result'
|
5
4
|
|
6
5
|
class PgExport
|
7
6
|
module Operations
|
8
7
|
class EncryptDump
|
9
|
-
|
10
|
-
|
8
|
+
def initialize(cipher_factory:)
|
9
|
+
@cipher_factory = cipher_factory
|
10
|
+
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
:encrypt_dump
|
14
|
+
end
|
11
15
|
|
12
16
|
def call(dump:)
|
13
17
|
dump.encrypt(cipher_factory: cipher_factory)
|
14
|
-
|
18
|
+
|
19
|
+
ValueObjects::Success.new(dump: dump)
|
15
20
|
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :cipher_factory
|
16
25
|
end
|
17
26
|
end
|
18
27
|
end
|
@@ -1,19 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'pg_export/import'
|
3
|
+
require 'pg_export/lib/pg_export/value_objects/result'
|
5
4
|
|
6
5
|
class PgExport
|
7
6
|
module Operations
|
8
7
|
class OpenConnection
|
9
|
-
|
10
|
-
|
8
|
+
def initialize(gateway_factory:)
|
9
|
+
@gateway_factory = gateway_factory
|
10
|
+
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
:open_connection
|
14
|
+
end
|
11
15
|
|
12
16
|
def call(inputs)
|
13
17
|
gateway = gateway_factory.gateway
|
14
18
|
gateway.open
|
15
|
-
|
19
|
+
|
20
|
+
ValueObjects::Success.new(inputs.merge(gateway: gateway))
|
16
21
|
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :gateway_factory
|
17
26
|
end
|
18
27
|
end
|
19
28
|
end
|
@@ -1,26 +1,34 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'pg_export/import'
|
3
|
+
require 'pg_export/lib/pg_export/value_objects/result'
|
5
4
|
|
6
5
|
class PgExport
|
7
6
|
module Operations
|
8
7
|
class RemoveOldDumps
|
9
|
-
|
10
|
-
|
8
|
+
def initialize(gateway_dump_repository:, keep:)
|
9
|
+
@gateway_dump_repository, @keep = gateway_dump_repository, keep
|
10
|
+
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
:remove_old_dumps
|
14
|
+
end
|
11
15
|
|
12
16
|
def call(dump:, gateway:)
|
13
17
|
dumps = gateway_dump_repository.by_database_name(
|
14
18
|
database_name: dump.database,
|
15
19
|
gateway: gateway,
|
16
|
-
offset:
|
20
|
+
offset: keep
|
17
21
|
)
|
18
22
|
dumps.each do |d|
|
19
23
|
gateway.delete(d.name)
|
20
24
|
end
|
21
25
|
|
22
|
-
Success(removed_dumps: dumps, gateway: gateway)
|
26
|
+
ValueObjects::Success.new(removed_dumps: dumps, gateway: gateway)
|
23
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :gateway_dump_repository, :keep
|
24
32
|
end
|
25
33
|
end
|
26
34
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'open3'
|
4
|
-
require 'pg_export/import'
|
5
4
|
require 'pg_export/lib/pg_export/entities/dump'
|
6
5
|
require 'pg_export/lib/pg_export/value_objects/dump_file'
|
7
6
|
|
@@ -10,11 +9,7 @@ class PgExport
|
|
10
9
|
class GatewayDumpRepository
|
11
10
|
def all(database_name:, gateway:)
|
12
11
|
gateway.list(database_name).map do |item|
|
13
|
-
|
14
|
-
dump(item[:name], database_name, item[:size])
|
15
|
-
rescue Dry::Types::ConstraintError
|
16
|
-
nil
|
17
|
-
end
|
12
|
+
dump(item[:name], database_name, item[:size])
|
18
13
|
end.compact
|
19
14
|
end
|
20
15
|
|
@@ -22,7 +17,7 @@ class PgExport
|
|
22
17
|
gateway.list(database_name).drop(offset).map do |item|
|
23
18
|
begin
|
24
19
|
dump(item[:name], database_name, item[:size])
|
25
|
-
rescue
|
20
|
+
rescue ArgumentError
|
26
21
|
nil
|
27
22
|
end
|
28
23
|
end.compact
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class PgExport
|
4
|
+
module Transactions
|
5
|
+
class Evaluator
|
6
|
+
def initialize(listeners)
|
7
|
+
@operations = []
|
8
|
+
@listeners = listeners
|
9
|
+
end
|
10
|
+
|
11
|
+
def <<(operation)
|
12
|
+
operations << operation
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(input)
|
16
|
+
result = ValueObjects::Success.new(input)
|
17
|
+
|
18
|
+
operations.each do |operation|
|
19
|
+
result = result.bind do
|
20
|
+
call_operation(operation, result)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :operations, :listeners
|
30
|
+
|
31
|
+
def call_operation(operation, input)
|
32
|
+
listener = listeners[operation.name]
|
33
|
+
|
34
|
+
before_call(listener, input)
|
35
|
+
result = operation.call(**input.value)
|
36
|
+
after_call(listener, result)
|
37
|
+
result
|
38
|
+
end
|
39
|
+
|
40
|
+
def before_call(listener, input)
|
41
|
+
return if listener.nil?
|
42
|
+
|
43
|
+
listener.on_step(value: input.value)
|
44
|
+
end
|
45
|
+
|
46
|
+
def after_call(listener, result)
|
47
|
+
return if listener.nil?
|
48
|
+
|
49
|
+
result.on_success do
|
50
|
+
listener.on_step_succeeded(value: result.value)
|
51
|
+
end
|
52
|
+
|
53
|
+
result.on_failure do
|
54
|
+
listener.on_step_failed(value: result.value)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -1,35 +1,41 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require 'dry/transaction'
|
6
|
-
|
7
|
-
require 'pg_export/import'
|
8
|
-
require 'pg_export/container'
|
3
|
+
require 'pg_export/lib/pg_export/transactions/evaluator'
|
9
4
|
require 'pg_export/lib/pg_export/value_objects/dump_file'
|
5
|
+
require 'pg_export/lib/pg_export/value_objects/result'
|
10
6
|
|
11
7
|
class PgExport
|
12
8
|
module Transactions
|
13
9
|
class ExportDump
|
14
|
-
|
15
|
-
|
10
|
+
def initialize(dump_factory:, bash_adapter:, encrypt_dump:, open_connection:, remove_old_dumps:, listeners:)
|
11
|
+
@dump_factory = dump_factory
|
12
|
+
@bash_adapter = bash_adapter
|
13
|
+
|
14
|
+
@evaluator = Evaluator.new(listeners)
|
15
|
+
@evaluator << method(:prepare_params)
|
16
|
+
@evaluator << method(:build_dump)
|
17
|
+
@evaluator << encrypt_dump
|
18
|
+
@evaluator << open_connection
|
19
|
+
@evaluator << method(:upload_dump)
|
20
|
+
@evaluator << remove_old_dumps
|
21
|
+
@evaluator << method(:close_connection)
|
22
|
+
end
|
16
23
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
step :open_connection, with: 'operations.open_connection'
|
21
|
-
step :upload_dump
|
22
|
-
step :remove_old_dumps, with: 'operations.remove_old_dumps'
|
23
|
-
step :close_connection
|
24
|
+
def call(input)
|
25
|
+
evaluator.call(input)
|
26
|
+
end
|
24
27
|
|
25
28
|
private
|
26
29
|
|
30
|
+
attr_reader :evaluator, :dump_factory, :bash_adapter
|
31
|
+
|
32
|
+
|
27
33
|
def prepare_params(database_name:)
|
28
34
|
database_name = database_name.to_s
|
29
35
|
|
30
|
-
return Failure(message: 'Invalid database name') if database_name.empty?
|
36
|
+
return ValueObjects::Failure.new(message: 'Invalid database name') if database_name.empty?
|
31
37
|
|
32
|
-
Success(database_name: database_name)
|
38
|
+
ValueObjects::Success.new(database_name: database_name)
|
33
39
|
end
|
34
40
|
|
35
41
|
def build_dump(database_name:)
|
@@ -37,19 +43,19 @@ class PgExport
|
|
37
43
|
database: database_name,
|
38
44
|
file: bash_adapter.pg_dump(ValueObjects::DumpFile.new, database_name)
|
39
45
|
)
|
40
|
-
Success(dump: dump)
|
46
|
+
ValueObjects::Success.new(dump: dump)
|
41
47
|
rescue bash_adapter.class::PgDumpError => e
|
42
|
-
Failure(message: 'Unable to dump database: ' + e.to_s)
|
48
|
+
ValueObjects::Failure.new(message: 'Unable to dump database: ' + e.to_s)
|
43
49
|
end
|
44
50
|
|
45
51
|
def upload_dump(dump:, gateway:)
|
46
52
|
gateway.persist(dump.file, dump.name)
|
47
|
-
Success(dump: dump, gateway: gateway)
|
53
|
+
ValueObjects::Success.new(dump: dump, gateway: gateway)
|
48
54
|
end
|
49
55
|
|
50
56
|
def close_connection(removed_dumps:, gateway:)
|
51
57
|
gateway.close
|
52
|
-
Success(gateway: gateway)
|
58
|
+
ValueObjects::Success.new(gateway: gateway)
|
53
59
|
end
|
54
60
|
end
|
55
61
|
end
|
@@ -1,66 +1,68 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require 'dry/transaction'
|
6
|
-
|
7
|
-
require 'pg_export/import'
|
8
|
-
require 'pg_export/container'
|
3
|
+
require 'pg_export/lib/pg_export/transactions/evaluator'
|
4
|
+
require 'pg_export/lib/pg_export/value_objects/result'
|
9
5
|
|
10
6
|
class PgExport
|
11
7
|
module Transactions
|
12
8
|
class ImportDumpInteractively
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
9
|
+
def initialize(input:, bash_adapter:, gateway_dump_repository:, gateway_dump_file_repository:, open_connection:, decrypt_dump:, listeners:)
|
10
|
+
@input = input
|
11
|
+
@bash_adapter = bash_adapter
|
12
|
+
@gateway_dump_repository = gateway_dump_repository
|
13
|
+
@gateway_dump_file_repository = gateway_dump_file_repository
|
14
|
+
|
15
|
+
@evaluator = Evaluator.new(listeners)
|
16
|
+
@evaluator << open_connection
|
17
|
+
@evaluator << method(:fetch_dumps)
|
18
|
+
@evaluator << method(:select_dump)
|
19
|
+
@evaluator << method(:download_dump)
|
20
|
+
@evaluator << method(:close_connection)
|
21
|
+
@evaluator << decrypt_dump
|
22
|
+
@evaluator << method(:select_database)
|
23
|
+
@evaluator << method(:restore)
|
24
|
+
end
|
20
25
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
step :download_dump
|
25
|
-
step :close_connection
|
26
|
-
step :decrypt_dump, with: 'operations.decrypt_dump'
|
27
|
-
step :select_database
|
28
|
-
step :restore
|
26
|
+
def call(input)
|
27
|
+
evaluator.call(input)
|
28
|
+
end
|
29
29
|
|
30
30
|
private
|
31
31
|
|
32
|
+
attr_reader :evaluator, :input, :bash_adapter, :gateway_dump_repository, :gateway_dump_file_repository
|
33
|
+
|
32
34
|
def fetch_dumps(database_name:, gateway:)
|
33
35
|
dumps = gateway_dump_repository.all(database_name: database_name, gateway: gateway)
|
34
|
-
return Failure(message: 'No dumps') if dumps.none?
|
36
|
+
return ValueObjects::Failure.new(message: 'No dumps') if dumps.none?
|
35
37
|
|
36
|
-
Success(gateway: gateway, dumps: dumps)
|
38
|
+
ValueObjects::Success.new(gateway: gateway, dumps: dumps)
|
37
39
|
end
|
38
40
|
|
39
41
|
def select_dump(dumps:, gateway:)
|
40
42
|
dump = input.select_dump(dumps)
|
41
|
-
Success(dump: dump, gateway: gateway)
|
43
|
+
ValueObjects::Success.new(dump: dump, gateway: gateway)
|
42
44
|
end
|
43
45
|
|
44
46
|
def download_dump(dump:, gateway:)
|
45
47
|
dump.file = gateway_dump_file_repository.by_name(name: dump.name, gateway: gateway)
|
46
|
-
Success(dump: dump, gateway: gateway)
|
48
|
+
ValueObjects::Success.new(dump: dump, gateway: gateway)
|
47
49
|
end
|
48
50
|
|
49
51
|
def close_connection(dump:, gateway:)
|
50
52
|
Thread.new { gateway.close }
|
51
|
-
Success(dump: dump)
|
53
|
+
ValueObjects::Success.new(dump: dump)
|
52
54
|
end
|
53
55
|
|
54
56
|
def select_database(dump:)
|
55
57
|
name = input.enter_database_name(dump.database)
|
56
|
-
Success(dump: dump, database: name)
|
58
|
+
ValueObjects::Success.new(dump: dump, database: name)
|
57
59
|
end
|
58
60
|
|
59
61
|
def restore(dump:, database:)
|
60
62
|
bash_adapter.pg_restore(dump.file, database)
|
61
|
-
Success({})
|
63
|
+
ValueObjects::Success.new({})
|
62
64
|
rescue bash_adapter.class::PgRestoreError => e
|
63
|
-
Failure(message: e.to_s)
|
65
|
+
ValueObjects::Failure.new(message: e.to_s)
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|