MariaDBDriver.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace PhpDevCommunity\PaperORM\Driver;
  3. use PDO;
  4. use PhpDevCommunity\PaperORM\PaperConnection;
  5. use PhpDevCommunity\PaperORM\Pdo\PaperPDO;
  6. use PhpDevCommunity\PaperORM\Platform\MariaDBPlatform;
  7. use PhpDevCommunity\PaperORM\Platform\PlatformInterface;
  8. use PhpDevCommunity\PaperORM\Platform\SqlitePlatform;
  9. use PhpDevCommunity\PaperORM\Schema\MariaDBSchema;
  10. use PhpDevCommunity\PaperORM\Schema\SqliteSchema;
  11. final class MariaDBDriver implements DriverInterface
  12. {
  13. public function connect(
  14. #[SensitiveParameter]
  15. array $params
  16. ): PaperPDO
  17. {
  18. $driverOptions = $params['driverOptions'] ?? [
  19. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  20. ];
  21. if (!empty($params['persistent'])) {
  22. $driverOptions[PDO::ATTR_PERSISTENT] = true;
  23. }
  24. return new PaperPDO(
  25. $this->constructPdoDsn($params),
  26. $params['user'] ?? '',
  27. $params['password'] ?? '',
  28. $driverOptions,
  29. );
  30. }
  31. /**
  32. * Constructs the Sqlite PDO DSN.
  33. *
  34. * @param array<string, mixed> $params
  35. */
  36. private function constructPdoDsn(array $params): string
  37. {
  38. $dsn = 'mysql:';
  39. if (isset($params['host']) && $params['host'] !== '') {
  40. $dsn .= 'host=' . $params['host'] . ';';
  41. }
  42. if (isset($params['port'])) {
  43. $dsn .= 'port=' . $params['port'] . ';';
  44. }
  45. if (isset($params['dbname'])) {
  46. $dsn .= 'dbname=' . $params['dbname'] . ';';
  47. }elseif (isset($params['path'])) {
  48. $dsn .= 'dbname=' . $params['path'] . ';';
  49. }
  50. if (isset($params['unix_socket'])) {
  51. $dsn .= 'unix_socket=' . $params['unix_socket'] . ';';
  52. }
  53. if (isset($params['options']['charset'])) {
  54. $dsn .= sprintf('charset=%s;', $params['options']['charset']);
  55. }
  56. return $dsn;
  57. }
  58. public function createDatabasePlatform(PaperConnection $connection): PlatformInterface
  59. {
  60. return new MariaDBPlatform($connection, $this->createDatabaseSchema());
  61. }
  62. public function createDatabaseSchema(): MariaDBSchema
  63. {
  64. return new MariaDBSchema();
  65. }
  66. }