. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\ORM\PDO; use Espo\ORM\DatabaseParams; use PDO; use RuntimeException; class MysqlPDOFactory implements PDOFactory { private const DEFAULT_CHARSET = 'utf8mb4'; public function create(DatabaseParams $databaseParams): PDO { $platform = strtolower($databaseParams->getPlatform() ?? ''); $host = $databaseParams->getHost(); $port = $databaseParams->getPort(); $dbname = $databaseParams->getName(); $charset = $databaseParams->getCharset() ?? self::DEFAULT_CHARSET; $username = $databaseParams->getUsername(); $password = $databaseParams->getPassword(); if (!$platform) { throw new RuntimeException("No 'platform' parameter."); } if (!$host) { throw new RuntimeException("No 'host' parameter."); } $dsn = $platform . ':' . 'host=' . $host; if ($port) { $dsn .= ';' . 'port=' . (string) $port; } if ($dbname) { $dsn .= ';' . 'dbname=' . $dbname; } $dsn .= ';' . 'charset=' . $charset; $options = Options::getOptionsFromDatabaseParams($databaseParams); $pdo = new PDO($dsn, $username, $password, $options); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; } }