HuasoFoundries /
phpPgAdmin6
| 1 | <?php |
||||
| 2 | |||||
| 3 | /** |
||||
| 4 | * PHPPgAdmin 6.1.3 |
||||
| 5 | */ |
||||
| 6 | |||||
| 7 | namespace PHPPgAdmin; |
||||
| 8 | |||||
| 9 | /** |
||||
| 10 | * @file |
||||
| 11 | * Class to represent a database connection |
||||
| 12 | * |
||||
| 13 | * Id: Connection.php,v 1.15 2008/02/18 21:42:47 ioguix Exp $ |
||||
| 14 | */ |
||||
| 15 | class Connection |
||||
| 16 | { |
||||
| 17 | use \PHPPgAdmin\Traits\HelperTrait; |
||||
| 18 | |||||
| 19 | public $conn; |
||||
| 20 | |||||
| 21 | public $platform = 'UNKNOWN'; |
||||
| 22 | |||||
| 23 | /** |
||||
| 24 | * @var string |
||||
| 25 | */ |
||||
| 26 | public $driver; |
||||
| 27 | |||||
| 28 | protected $container; |
||||
| 29 | |||||
| 30 | protected $server_info; |
||||
| 31 | |||||
| 32 | protected $version_dictionary = [ |
||||
| 33 | '13' => 'Postgres13', |
||||
| 34 | '12' => 'Postgres12', |
||||
| 35 | '11' => 'Postgres11', |
||||
| 36 | '10' => 'Postgres10', |
||||
| 37 | '9.7' => 'Postgres96', |
||||
| 38 | '9.6' => 'Postgres96', |
||||
| 39 | '9.5' => 'Postgres95', |
||||
| 40 | '9.4' => 'Postgres94', |
||||
| 41 | '9.3' => 'Postgres93', |
||||
| 42 | '9.2' => 'Postgres92', |
||||
| 43 | '9.1' => 'Postgres91', |
||||
| 44 | '9.0' => 'Postgres90', |
||||
| 45 | ]; |
||||
| 46 | |||||
| 47 | /** |
||||
| 48 | * @var string |
||||
| 49 | */ |
||||
| 50 | private $pgVersion; |
||||
| 51 | |||||
| 52 | /** |
||||
| 53 | * @var string |
||||
| 54 | */ |
||||
| 55 | private $_captured_error; |
||||
| 56 | |||||
| 57 | private $adodb_driver = 'postgres9'; |
||||
| 58 | |||||
| 59 | // The backend platform. Set to UNKNOWN by default. |
||||
| 60 | private $_connection_result; |
||||
| 61 | |||||
| 62 | /** |
||||
| 63 | * Creates a new connection. Will actually make a database connection. |
||||
| 64 | * |
||||
| 65 | * @param array $server_info |
||||
| 66 | * @param string $database database name |
||||
| 67 | * @param \PHPPgAdmin\ContainerUtils $container |
||||
| 68 | * @param int $fetchMode Defaults to associative. Override for different behaviour |
||||
| 69 | */ |
||||
| 70 | public function __construct($server_info, $database, $container, $fetchMode = ADODB_FETCH_ASSOC) |
||||
| 71 | { |
||||
| 72 | $host = $server_info['host']; |
||||
| 73 | $port = $server_info['port']; |
||||
| 74 | $sslmode = $server_info['sslmode']; |
||||
| 75 | $user = $server_info['username']; |
||||
| 76 | $password = $server_info['password']; |
||||
| 77 | |||||
| 78 | $this->server_info = $server_info; |
||||
| 79 | |||||
| 80 | $this->container = $container; |
||||
| 81 | |||||
| 82 | $this->conn = 'pdo' === $this->adodb_driver ? |
||||
|
0 ignored issues
–
show
introduced
by
Loading history...
|
|||||
| 83 | $this->getPDOConnection($host, $port, $sslmode, $database, $user, $password, $fetchMode) : |
||||
| 84 | $this->getPG9Connection($host, $port, $sslmode, $database, $user, $password, $fetchMode); |
||||
| 85 | $this->conn->setFetchMode($fetchMode); |
||||
|
0 ignored issues
–
show
$fetchMode of type integer is incompatible with the type The expected by parameter $mode of ADOConnection::SetFetchMode().
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 86 | |||||
| 87 | //$this->prtrace($this->conn); |
||||
| 88 | } |
||||
| 89 | |||||
| 90 | public function getVersion(): string |
||||
| 91 | { |
||||
| 92 | return $this->pgVersion; |
||||
| 93 | } |
||||
| 94 | |||||
| 95 | /** |
||||
| 96 | * Gets the name of the correct database driver to use. As a side effect, |
||||
| 97 | * sets the platform. |
||||
| 98 | * |
||||
| 99 | * @param string $description A description of the database and version (returns by reference) |
||||
| 100 | * |
||||
| 101 | * @return string The driver. e.g. Postgres96 |
||||
| 102 | */ |
||||
| 103 | public function getDriver(&$description) |
||||
| 104 | { |
||||
| 105 | if (!$this->conn->IsConnected()) { |
||||
| 106 | return null; |
||||
| 107 | } |
||||
| 108 | $serverInfo = $this->conn->ServerInfo(); |
||||
| 109 | $this->dump($serverInfo); |
||||
| 110 | $this->pgVersion = $serverInfo['version']; |
||||
| 111 | $description = "PostgreSQL {$this->pgVersion}"; |
||||
| 112 | |||||
| 113 | $version_parts = \explode('.', $this->pgVersion); |
||||
| 114 | |||||
| 115 | if ((int) (10 <= $version_parts[0])) { |
||||
| 116 | $major_version = $version_parts[0]; |
||||
| 117 | } else { |
||||
| 118 | $major_version = \implode('.', [$version_parts[0], $version_parts[1]]); |
||||
| 119 | } |
||||
| 120 | |||||
| 121 | // if major version is less than 9 return null, we don't support it |
||||
| 122 | if (9 > (float) $major_version) { |
||||
| 123 | $this->driver = null; |
||||
| 124 | |||||
| 125 | return null; |
||||
| 126 | } |
||||
| 127 | |||||
| 128 | $this->driver = 'Postgres'; |
||||
| 129 | //$this->prtrace(['pg_version' => pg_version($this->conn->_connectionID), 'version' => $version, 'major_version' => $major_version]); |
||||
| 130 | // Detect version and choose appropriate database driver |
||||
| 131 | if (\array_key_exists($major_version, $this->version_dictionary)) { |
||||
| 132 | $this->driver = $this->version_dictionary[$major_version]; |
||||
| 133 | } |
||||
| 134 | |||||
| 135 | // If unknown version, then default to latest driver |
||||
| 136 | return $this->driver; |
||||
| 137 | } |
||||
| 138 | |||||
| 139 | /** |
||||
| 140 | * Get the last error in the connection. |
||||
| 141 | * |
||||
| 142 | * @return string Error string |
||||
| 143 | */ |
||||
| 144 | public function getLastError() |
||||
| 145 | { |
||||
| 146 | return $this->conn->ErrorMsg(); |
||||
|
0 ignored issues
–
show
|
|||||
| 147 | } |
||||
| 148 | |||||
| 149 | private function getPG9Connection( |
||||
| 150 | string $host, |
||||
| 151 | int $port, |
||||
| 152 | string $sslmode, |
||||
| 153 | ?string $database, |
||||
| 154 | ?string $user, |
||||
| 155 | ?string $password, |
||||
| 156 | int $fetchMode = \ADODB_FETCH_ASSOC |
||||
| 157 | ): \ADODB_postgres9 { |
||||
| 158 | $this->conn = ADONewConnection('postgres9'); |
||||
| 159 | $this->conn->setFetchMode($fetchMode); |
||||
| 160 | // Ignore host if null |
||||
| 161 | if (null === $host || '' === $host) { |
||||
| 162 | if (null !== $port && '' !== $port) { |
||||
|
0 ignored issues
–
show
|
|||||
| 163 | $pghost = ':' . $port; |
||||
| 164 | } else { |
||||
| 165 | $pghost = ''; |
||||
| 166 | } |
||||
| 167 | } else { |
||||
| 168 | $pghost = "{$host}:{$port}"; |
||||
| 169 | } |
||||
| 170 | |||||
| 171 | // Add sslmode to $pghost as needed |
||||
| 172 | if (('disable' === $sslmode) || ('allow' === $sslmode) || ('prefer' === $sslmode) || ('require' === $sslmode)) { |
||||
| 173 | $pghost .= ':' . $sslmode; |
||||
| 174 | } elseif ('legacy' === $sslmode) { |
||||
| 175 | $pghost .= ' requiressl=1'; |
||||
| 176 | } |
||||
| 177 | \ob_start(); |
||||
| 178 | $this->_connection_result = $this->conn->connect($pghost, $user, $password, $database); |
||||
| 179 | |||||
| 180 | $this->_captured_error = \ob_get_clean(); |
||||
| 181 | |||||
| 182 | return $this->conn; |
||||
| 183 | } |
||||
| 184 | |||||
| 185 | private function getPDOConnection( |
||||
| 186 | string $host, |
||||
| 187 | int $port, |
||||
| 188 | string $sslmode, |
||||
| 189 | ?string $database, |
||||
| 190 | ?string $user, |
||||
| 191 | ?string $password, |
||||
| 192 | int $fetchMode = \ADODB_FETCH_ASSOC |
||||
| 193 | ): \ADODB_pdo { |
||||
| 194 | $this->conn = ADONewConnection('pdo'); |
||||
| 195 | $this->conn->setFetchMode($fetchMode); |
||||
| 196 | $dsnString = \sprintf('pgsql:host=%s;port=%d;dbname=%s;sslmode=%s;application_name=PHPPgAdmin6', $host, $port, $database, $sslmode); |
||||
| 197 | $this->conn->connect($dsnString, $user, $password); |
||||
| 198 | |||||
| 199 | return $this->conn; |
||||
| 200 | } |
||||
| 201 | } |
||||
| 202 |