diff --git a/composer.lock b/composer.lock index 573407f5b..8f3d208b3 100644 --- a/composer.lock +++ b/composer.lock @@ -2608,5 +2608,5 @@ "php": ">=8.0" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.2.0" } diff --git a/src/Database/Adapter.php b/src/Database/Adapter.php index fa59aecd3..03bbb789e 100644 --- a/src/Database/Adapter.php +++ b/src/Database/Adapter.php @@ -246,11 +246,11 @@ abstract public function create(string $name): bool; * Optionally check if collection exists in database * * @param string $database database name - * @param string $collection (optional) collection name + * @param string|null $collection (optional) collection name * * @return bool */ - abstract public function exists(string $database, ?string $collection): bool; + abstract public function exists(string $database, ?string $collection = null): bool; /** * List Databases diff --git a/src/Database/Adapter/MariaDB.php b/src/Database/Adapter/MariaDB.php index 05d66ef60..2684d84ab 100644 --- a/src/Database/Adapter/MariaDB.php +++ b/src/Database/Adapter/MariaDB.php @@ -27,7 +27,11 @@ public function create(string $name): bool { $name = $this->filter($name); - $sql = "CREATE DATABASE IF NOT EXISTS `{$name}` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;"; + if ($this->exists($name)) { + return true; + } + + $sql = "CREATE DATABASE `{$name}` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;"; $sql = $this->trigger(Database::EVENT_DATABASE_CREATE, $sql); diff --git a/src/Database/Adapter/Postgres.php b/src/Database/Adapter/Postgres.php index 6b9e3795c..d065b9850 100644 --- a/src/Database/Adapter/Postgres.php +++ b/src/Database/Adapter/Postgres.php @@ -36,7 +36,11 @@ public function create(string $name): bool { $name = $this->filter($name); - $sql = "CREATE SCHEMA IF NOT EXISTS \"{$name}\""; + if ($this->exists($name)) { + return true; + } + + $sql = "CREATE SCHEMA \"{$name}\""; $sql = $this->trigger(Database::EVENT_DATABASE_CREATE, $sql); return $this->getPDO() diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 39729e8b6..dff450ff7 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -50,45 +50,30 @@ public function ping(): bool * @return bool * @throws Exception */ - public function exists(string $database, ?string $collection): bool + public function exists(string $database, ?string $collection = null): bool { $database = $this->filter($database); if (!\is_null($collection)) { $collection = $this->filter($collection); - - $select = 'TABLE_NAME'; - $from = 'INFORMATION_SCHEMA.TABLES'; - $where = 'TABLE_SCHEMA = :schema AND TABLE_NAME = :table'; - $match = "{$this->getNamespace()}_{$collection}"; - } else { - $select = 'SCHEMA_NAME'; - $from = 'INFORMATION_SCHEMA.SCHEMATA'; - $where = 'SCHEMA_NAME = :schema'; - $match = $database; - } - - $stmt = $this->getPDO() - ->prepare("SELECT {$select} - FROM {$from} - WHERE {$where};"); - - $stmt->bindValue(':schema', $database, PDO::PARAM_STR); - - if (!\is_null($collection)) { + $stmt = $this->getPDO()->prepare("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = :schema AND TABLE_NAME = :table"); + $stmt->bindValue(':schema', $database, PDO::PARAM_STR); $stmt->bindValue(':table', "{$this->getNamespace()}_{$collection}", PDO::PARAM_STR); + } else { + $stmt = $this->getPDO()->prepare("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = :schema"); + $stmt->bindValue(':schema', $database, PDO::PARAM_STR); } $stmt->execute(); $document = $stmt->fetchAll(); $stmt->closeCursor(); - if (!empty($document)) { - $document = $document[0]; + + if (empty($document)) { + return false; } - return (($document[$select] ?? '') === $match) || // case insensitive check - (($document[strtolower($select)] ?? '') === $match); + return true; } /** diff --git a/src/Database/Adapter/SQLite.php b/src/Database/Adapter/SQLite.php index c4afe6810..a11c374d5 100644 --- a/src/Database/Adapter/SQLite.php +++ b/src/Database/Adapter/SQLite.php @@ -32,12 +32,11 @@ class SQLite extends MariaDB * Optionally check if collection exists in Database * * @param string $database - * @param string $collection + * @param string|null $collection * @return bool - * @throws Exception - * @throws PDOException + * @throws DatabaseException */ - public function exists(string $database, ?string $collection): bool + public function exists(string $database, ?string $collection = null): bool { $database = $this->filter($database);