From 107a6332c01da5c08bc2b31a158cf08acc0ac792 Mon Sep 17 00:00:00 2001 From: fogelito Date: Tue, 3 Oct 2023 11:37:06 +0300 Subject: [PATCH 1/5] Check database before create --- src/Database/Adapter.php | 4 +-- src/Database/Adapter/MariaDB.php | 4 +++ src/Database/Adapter/SQL.php | 34 ++++++++----------------- src/Database/Adapter/SQLite.php | 7 +++-- tests/Database/Adapter/MariaDBTest.php | 5 ---- tests/Database/Adapter/MongoDBTest.php | 5 ---- tests/Database/Adapter/MySQLTest.php | 5 ---- tests/Database/Adapter/PostgresTest.php | 5 ---- 8 files changed, 19 insertions(+), 50 deletions(-) diff --git a/src/Database/Adapter.php b/src/Database/Adapter.php index decfd7db4..4f93d4b39 100644 --- a/src/Database/Adapter.php +++ b/src/Database/Adapter.php @@ -156,11 +156,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 d4647f754..3eadd0739 100644 --- a/src/Database/Adapter/MariaDB.php +++ b/src/Database/Adapter/MariaDB.php @@ -27,6 +27,10 @@ public function create(string $name): bool { $name = $this->filter($name); + if ($this->exists($name)) { + return true; + } + return $this->getPDO() ->prepare("CREATE DATABASE IF NOT EXISTS `{$name}` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;") ->execute(); diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 8525d2738..c962cc30e 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -50,41 +50,27 @@ 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->fetch(); + 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 932de4f3f..d2398d204 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); diff --git a/tests/Database/Adapter/MariaDBTest.php b/tests/Database/Adapter/MariaDBTest.php index af616f260..0f36f2427 100644 --- a/tests/Database/Adapter/MariaDBTest.php +++ b/tests/Database/Adapter/MariaDBTest.php @@ -49,11 +49,6 @@ public static function getDatabase(): Database $database = new Database(new MariaDB($pdo), $cache); $database->setDefaultDatabase('utopiaTests'); $database->setNamespace('myapp_'.uniqid()); - - if ($database->exists('utopiaTests')) { - $database->delete('utopiaTests'); - } - $database->create(); return self::$database = $database; diff --git a/tests/Database/Adapter/MongoDBTest.php b/tests/Database/Adapter/MongoDBTest.php index 62c48ae37..649064cd9 100644 --- a/tests/Database/Adapter/MongoDBTest.php +++ b/tests/Database/Adapter/MongoDBTest.php @@ -54,11 +54,6 @@ public static function getDatabase(): Database $database = new Database(new Mongo($client), $cache); $database->setDefaultDatabase($schema); $database->setNamespace('myapp_' . uniqid()); - - if ($database->exists('utopiaTests')) { - $database->delete('utopiaTests'); - } - $database->create(); return self::$database = $database; diff --git a/tests/Database/Adapter/MySQLTest.php b/tests/Database/Adapter/MySQLTest.php index 0faefca61..a06bf233f 100644 --- a/tests/Database/Adapter/MySQLTest.php +++ b/tests/Database/Adapter/MySQLTest.php @@ -60,11 +60,6 @@ public static function getDatabase(): Database $database = new Database(new MySQL($pdo), $cache); $database->setDefaultDatabase('utopiaTests'); $database->setNamespace('myapp_'.uniqid()); - - if ($database->exists('utopiaTests')) { - $database->delete('utopiaTests'); - } - $database->create(); return self::$database = $database; diff --git a/tests/Database/Adapter/PostgresTest.php b/tests/Database/Adapter/PostgresTest.php index 9965a8684..e4b6bd37f 100644 --- a/tests/Database/Adapter/PostgresTest.php +++ b/tests/Database/Adapter/PostgresTest.php @@ -47,11 +47,6 @@ public static function getDatabase(): Database $database = new Database(new Postgres($pdo), $cache); $database->setDefaultDatabase('utopiaTests'); $database->setNamespace('myapp_'.uniqid()); - - if ($database->exists('utopiaTests')) { - $database->delete('utopiaTests'); - } - $database->create(); return self::$database = $database; From fb4530ccafb6019dcec83d2546dcfc99826c6eaa Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 29 Oct 2023 16:02:03 +0200 Subject: [PATCH 2/5] Revert delete schema test --- tests/Database/Adapter/MariaDBTest.php | 5 +++++ tests/Database/Adapter/MongoDBTest.php | 5 +++++ tests/Database/Adapter/MySQLTest.php | 5 +++++ tests/Database/Adapter/PostgresTest.php | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/tests/Database/Adapter/MariaDBTest.php b/tests/Database/Adapter/MariaDBTest.php index 0f36f2427..af616f260 100644 --- a/tests/Database/Adapter/MariaDBTest.php +++ b/tests/Database/Adapter/MariaDBTest.php @@ -49,6 +49,11 @@ public static function getDatabase(): Database $database = new Database(new MariaDB($pdo), $cache); $database->setDefaultDatabase('utopiaTests'); $database->setNamespace('myapp_'.uniqid()); + + if ($database->exists('utopiaTests')) { + $database->delete('utopiaTests'); + } + $database->create(); return self::$database = $database; diff --git a/tests/Database/Adapter/MongoDBTest.php b/tests/Database/Adapter/MongoDBTest.php index 649064cd9..62c48ae37 100644 --- a/tests/Database/Adapter/MongoDBTest.php +++ b/tests/Database/Adapter/MongoDBTest.php @@ -54,6 +54,11 @@ public static function getDatabase(): Database $database = new Database(new Mongo($client), $cache); $database->setDefaultDatabase($schema); $database->setNamespace('myapp_' . uniqid()); + + if ($database->exists('utopiaTests')) { + $database->delete('utopiaTests'); + } + $database->create(); return self::$database = $database; diff --git a/tests/Database/Adapter/MySQLTest.php b/tests/Database/Adapter/MySQLTest.php index a06bf233f..0faefca61 100644 --- a/tests/Database/Adapter/MySQLTest.php +++ b/tests/Database/Adapter/MySQLTest.php @@ -60,6 +60,11 @@ public static function getDatabase(): Database $database = new Database(new MySQL($pdo), $cache); $database->setDefaultDatabase('utopiaTests'); $database->setNamespace('myapp_'.uniqid()); + + if ($database->exists('utopiaTests')) { + $database->delete('utopiaTests'); + } + $database->create(); return self::$database = $database; diff --git a/tests/Database/Adapter/PostgresTest.php b/tests/Database/Adapter/PostgresTest.php index e4b6bd37f..9965a8684 100644 --- a/tests/Database/Adapter/PostgresTest.php +++ b/tests/Database/Adapter/PostgresTest.php @@ -47,6 +47,11 @@ public static function getDatabase(): Database $database = new Database(new Postgres($pdo), $cache); $database->setDefaultDatabase('utopiaTests'); $database->setNamespace('myapp_'.uniqid()); + + if ($database->exists('utopiaTests')) { + $database->delete('utopiaTests'); + } + $database->create(); return self::$database = $database; From 77beada047e1a99e12616d143394e439331cf663 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 29 Oct 2023 16:13:07 +0200 Subject: [PATCH 3/5] Merge main updates --- composer.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index 91cb09a27..78b0fa67b 100644 --- a/composer.lock +++ b/composer.lock @@ -513,16 +513,16 @@ }, { "name": "laravel/pint", - "version": "v1.13.3", + "version": "v1.13.5", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "93b2d0d49719bc6e444ba21cd4dbbccec935413d" + "reference": "df105cf8ce7a8f0b8a9425ff45cd281a5448e423" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/93b2d0d49719bc6e444ba21cd4dbbccec935413d", - "reference": "93b2d0d49719bc6e444ba21cd4dbbccec935413d", + "url": "https://api.github.com/repos/laravel/pint/zipball/df105cf8ce7a8f0b8a9425ff45cd281a5448e423", + "reference": "df105cf8ce7a8f0b8a9425ff45cd281a5448e423", "shasum": "" }, "require": { @@ -534,12 +534,12 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.34.1", - "illuminate/view": "^10.23.1", + "illuminate/view": "^10.26.2", "laravel-zero/framework": "^10.1.2", "mockery/mockery": "^1.6.6", "nunomaduro/larastan": "^2.6.4", "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.18.2" + "pestphp/pest": "^2.20.0" }, "bin": [ "builds/pint" @@ -575,7 +575,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2023-10-10T15:39:09+00:00" + "time": "2023-10-26T09:26:10+00:00" }, { "name": "myclabs/deep-copy", @@ -2608,5 +2608,5 @@ "php": ">=8.0" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.2.0" } From 00f7faa31c2ce7abb7f68ed6f5dd90dff45f3fd3 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 10 Nov 2023 11:06:41 +1300 Subject: [PATCH 4/5] Remove redundant if not exists --- src/Database/Adapter/MariaDB.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Database/Adapter/MariaDB.php b/src/Database/Adapter/MariaDB.php index 25fd4a18b..2684d84ab 100644 --- a/src/Database/Adapter/MariaDB.php +++ b/src/Database/Adapter/MariaDB.php @@ -31,7 +31,7 @@ public function create(string $name): bool return true; } - $sql = "CREATE DATABASE IF NOT EXISTS `{$name}` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;"; + $sql = "CREATE DATABASE `{$name}` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;"; $sql = $this->trigger(Database::EVENT_DATABASE_CREATE, $sql); From 33b007d58ed95d0c51da25673b61c222918fcb16 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 10 Nov 2023 11:07:34 +1300 Subject: [PATCH 5/5] Add postgres pre-exists check --- src/Database/Adapter/Postgres.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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()