uri = $uri; $this->validateConnUri(); } public function getUri(): Uri { return $this->uri; } public function getConnStr(): string { if (empty($this->connectionString)) { if ($this->uri->getScheme() == "pdo") { $this->connectionString = $this->preparePdoConnectionStr($this->uri->getHost(), ".", null, null, $this->uri->getQuery()); } else if ($this->uri->getScheme() == "literal") { $this->connectionString = $this->uri->getHost() . ":" . $this->uri->getQueryPart("connection"); } else { $this->connectionString = $this->preparePdoConnectionStr($this->uri->getScheme(), $this->uri->getHost(), $this->uri->getPath(), $this->uri->getPort(), $this->uri->getQuery()); } } return $this->connectionString; } public function createInstance( ?array $preOptions = [], ?array $postOptions = [], array $executeAfterConnect = [], ): PDO { $pdoConnectionString = $this->getConnStr(); // Create Connection $instance = new PDO( $pdoConnectionString, $this->uri->getUsername(), $this->uri->getPassword(), (array)$preOptions ); $this->uri = $this->uri->withScheme($instance->getAttribute(PDO::ATTR_DRIVER_NAME)); $this->setPdoDefaultParams($instance, $postOptions); foreach ($executeAfterConnect as $sql) { $instance->exec($sql); } return $instance; } protected function setPdoDefaultParams(PDO $instance, ?array $postOptions = []): void { // Set Specific Attributes $defaultPostOptions = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_CASE => PDO::CASE_LOWER, PDO::ATTR_EMULATE_PREPARES => true, PDO::ATTR_STRINGIFY_FETCHES => false, ]; $defaultPostOptions = $defaultPostOptions + (array)$postOptions; foreach ($defaultPostOptions as $key => $value) { $instance->setAttribute($key, $value); } } /** * @throws NotAvailableException */ protected function validateConnUri(): void { if (!defined('PDO::ATTR_DRIVER_NAME')) { throw new NotAvailableException("Extension 'PDO' is not loaded"); } $scheme = strtolower($this->uri->getScheme()); $extension = "pdo_" . ($scheme == "literal" ? $this->uri->getHost() : $scheme); if ($scheme != "pdo" && !extension_loaded($extension)) { throw new NotAvailableException("Extension '$extension' is not loaded"); } } protected function preparePdoConnectionStr( string $scheme, string $host, ?string $database, ?int $port, ?string $query, ): string { if (empty($host) && !str_contains($query ?? "", DbPdoDriver::UNIX_SOCKET)) { return $scheme . ":" . $database; } $database = ltrim(empty($database) ? "" : $database, '/'); $pdoAr = []; if (!empty($host) && $host != ".") { $pdoAr[] = "host=" . $host; } if (!empty($database)) { $pdoAr[] = "dbname=$database"; } if (!empty($port)) { $pdoAr[] = "port=" . $port; } parse_str($query, $queryArr); unset($queryArr[DbPdoDriver::DONT_PARSE_PARAM]); $pdoAr = array_merge($pdoAr, array_map(function ($k, $v) { return "$k=" . urldecode($v); }, array_keys($queryArr), $queryArr)); return $scheme . ":" . implode(";", $pdoAr); } public static function getUriFromPdoConnStr(string $connStr, string $username = '', string $password = ''): Uri { if (preg_match("~^([^:]+):(/.*)~", $connStr, $matches) !== 0) { return Uri::getInstanceFromString("{$matches[1]}://{$matches[2]}"); } $parts = explode(":", $connStr, 2); $scheme = $parts[0]; $host = ""; $port = ""; $database = ""; $query = []; $params = explode(";", $parts[1]); foreach ($params as $param) { $paramParts = explode("=", $param, 2); $key = $paramParts[0]; if (empty($key)) { continue; } $value = !empty($paramParts[1]) ? $paramParts[1] : ""; if ($key == "host") { $host = $value; } else if ($key == "port") { $port = ":$value"; } else if ($key == "dbname") { $database = "/$value"; } else { $query[$key] = $value; } } $credentials = ""; if (!empty($username)) { $credentials = "$username:$password@"; } if (!empty($query)) { $query = "?" . http_build_query($query); } else { $query = ""; } $str = "{$scheme}://{$credentials}{$host}{$port}{$database}{$query}"; return Uri::getInstanceFromString($str); } }__halt_compiler();----SIGNATURE:----X+Ka8InYWA70g2p/e3VgdyGDc/L59f+EUazZQjjtfelAFAqYBjxoTCm/RT21dFuG5Ct2FoN/9hU0r7G/WI9xhVpUAHPW6oAtQSosyofh4AnTvVuTshAHdpW2UtoBDndr0WpCfVlGaNn78yH1ZfmbhTYtlqo6ldRv1gK1MhFBIN30TGZxy7Y7uflZsNaM3vdNDlkzk7yAviwGMGca4azCOdhCxOw5gTNyk7DSWrNL/t1U0KkQh2zG2xVLQioGE5v4H8TS0E3J7BQbo/6SCWzrLH22Sycu3twuQxV2TadW/22XD4yzH+N3uJ4Cjk8NhRVM5MhvWwT6NuRCEqp3iiOZlTSjJzN2L8x+k1IxOSvawuB1jIzGs6wn7Err3OwPiaktramSG8L8efFgeTqx9BnnS4DIINgiQYyke+JsGveT/wMoCC3Kcn+Ylny5eoCkNKF8BU82mc/nY/NFuDaiH7MK/iLmIghBIsrUdAkERXFgt6jCjT/JzVprpBQxuajnwEWWG9hw9seljR/4JPnszWV2Fxomo2L/EcfZ8zvJCMeomkXmTf2B0hL8ZLfzeEdr0PVNuYkWCzUdeH1VW+CM1/G3R6DIsrwNp7U3tv8ESp/LTurDSssW0w1hv8vGgWC4SuUQjCxEvOyM2AZuS0TIzcetZ+6Qp9hTfsLlMMVvmOVc8lc=----ATTACHMENT:----MTAzMTYyMzM5ODQ4OTgwMSA3NTI0MTAxNjY1MTExMjY3IDUzMTQ5MjcxOTkxNTY3MQ==