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:----vny9PbivEi1zPK6fN3wQzzGP/wkys3Fa7mK636u3gtxAcO74LOMSXK68l9xp8LKOEfIE7o2uRwC7bGovtkHJqcgf4csrXxopWgly0pEQ9gU5Wo45R3vAb19I8hlPeS+jOefrQ30wjksy4wj2ABzEF9QmdgBSkRj9VtSqpWaJfkbjM41Q3rMBhiaJyzqgBkReuv/RS8DeDyUbWEeZae9WwqT7J/goXz2JR1fkmqy5a7aHKAosWIFqazahDv6kWpxkXG7l6Fu/I9EHOr9fnUf/FyjHgznZ+5KEJBYBvdrQYkoe9ipkfN9NcPoVuZo7uNPpKHOXS2n3WPpqDe5SHa4DOy2Tlxwd3HJ8UZ6famQK1vORcK3k54ZvVbmWJUXPSGPot/jgMtANp7pm9TbVt2GoaUDt20vwH/qu6R7uv21m3BrM1EwVoWYf6GU8zgiopwLsN5UF15IapS6zlbrFFkoozIX+EhaAjWJGEjpkbxVV3XDyYz3JcXEZQdb0sqGt/uU0BG41zlq2tWau3nJ2mfKz07/5v6GV0FV58nK30/wAy6mkz8nD+o1MV8opJXDd4c4lkCb4RB2MT5bSqM+1pPgYfKz/arSjRfEcZ3z7nFVRDWT5fTkLM3hAOvMn0Po60OXoOWrDXymS4W/F6oqtXDCij8qvSg+qc5UkL+B32kcOPac=----ATTACHMENT:----NDEwMTMyOTE1NzcyMzQ2NCA3NTk0NDI4NzEyNjY4MzcgNDE3MjA0ODYyODk0NDgwNg==