Psql::envPassword()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php declare(strict_types=1);
2
3
namespace PmgDev\DatabaseReplicator\Database\Postgres;
4
5
use PmgDev\DatabaseReplicator\Config;
6
use PmgDev\DatabaseReplicator\Exceptions;
7
use PmgDev\DatabaseReplicator\Source\Files;
8
9
class Psql
10
{
11
	/** @var Config */
12
	private $adminConfig;
13
14
	/** @var string */
15
	private $psql;
16
17
18
	public function __construct(Config $adminConfig, string $psql)
19
	{
20
		$this->adminConfig = $adminConfig;
21
		$this->psql = $psql;
22
	}
23
24
25
	/**
26
	 * Run psql
27
	 * @return string[]
28
	 * @throws Exceptions\ImportFilesFailedException
29
	 */
30
	public function importFiles(Files $files, Config $config): array
31
	{
32
		if (count($files) === 0) {
33
			return [];
34
		}
35
36
		self::envPassword($config);
37
38
		exec($this->buildCommand($config, $files), $output, $exitStatus);
39
		if ($exitStatus !== 0) {
40
			$files = implode(', ', (array) $files->getIterator());
41
			throw new Exceptions\ImportFilesFailedException("Files: {$files} -> Import failed:" . PHP_EOL . implode(PHP_EOL, $output));
42
		}
43
44
		return $output;
45
	}
46
47
48
	private function buildCommand(Config $config, Files $files): string
49
	{
50
		$filesCmd = '';
51
		foreach ($files as $filename) {
52
			if ($filesCmd !== '') {
53
				$filesCmd .= ' ';
54
			}
55
			$filesCmd .= sprintf('--file="%s"', $filename);
56
		}
57
58
		return vsprintf(
59
			'"%s" --variable=ON_ERROR_STOP=1 --host=%s --port=%s --username=%s %s %s 2>&1', [
60
				$this->psql,
61
				$config->host,
62
				$config->port,
63
				$config->username,
64
				$filesCmd,
65
				$config->database,
66
			]
67
		);
68
	}
69
70
71
	private static function envPassword(Config $config): void
72
	{
73
		putenv('PGPASSWORD=' . $config->password);
74
	}
75
76
}
77