From 0f0ad85de6abd5fef955a8e79aaa5705a3fcda58 Mon Sep 17 00:00:00 2001 From: Adam Lenda Date: Fri, 26 Mar 2021 15:57:14 -0400 Subject: [PATCH 1/5] Created DatabaseInterface and simple implementations --- src/Meta/MySql/Database.php | 36 ++++++++++++++++++++++++++++++++++ src/Meta/MySql/Schema.php | 11 ++--------- src/Meta/Postgres/Database.php | 35 +++++++++++++++++++++++++++++++++ src/Meta/Postgres/Schema.php | 10 ++-------- src/Meta/Sqlite/Database.php | 27 +++++++++++++++++++++++++ src/Meta/Sqlite/Schema.php | 4 ++-- 6 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 src/Meta/MySql/Database.php create mode 100644 src/Meta/Postgres/Database.php create mode 100644 src/Meta/Sqlite/Database.php diff --git a/src/Meta/MySql/Database.php b/src/Meta/MySql/Database.php new file mode 100644 index 00000000..4b3ab03f --- /dev/null +++ b/src/Meta/MySql/Database.php @@ -0,0 +1,36 @@ +connection = $connection; + } + + /** + * @inheritDoc + */ + public function getSchemaNames() + { + $schemas = $this->connection->getDoctrineSchemaManager()->listDatabases(); + + return array_diff($schemas, [ + 'information_schema', + 'sys', + 'mysql', + 'performance_schema', + ]); + } +} \ No newline at end of file diff --git a/src/Meta/MySql/Schema.php b/src/Meta/MySql/Schema.php index 186010f7..e8b755fc 100644 --- a/src/Meta/MySql/Schema.php +++ b/src/Meta/MySql/Schema.php @@ -265,19 +265,12 @@ protected function resolveForeignTable($table, Blueprint $blueprint) /** * @param \Illuminate\Database\Connection $connection - * + * @deprecated use \Reliese\Meta\MySql\Database::getSchemaNames instead * @return array */ public static function schemas(Connection $connection) { - $schemas = $connection->getDoctrineSchemaManager()->listDatabases(); - - return array_diff($schemas, [ - 'information_schema', - 'sys', - 'mysql', - 'performance_schema', - ]); + return (new Database($connection))->getSchemaNames(); } /** diff --git a/src/Meta/Postgres/Database.php b/src/Meta/Postgres/Database.php new file mode 100644 index 00000000..e6295fd3 --- /dev/null +++ b/src/Meta/Postgres/Database.php @@ -0,0 +1,35 @@ +connection = $connection; + } + + /** + * @inheritDoc + */ + public function getSchemaNames() + { + $schemas = $this->connection->getDoctrineSchemaManager()->listDatabases(); + + return array_diff($schemas, [ + 'postgres', + 'template0', + 'template1', + ]); + } +} \ No newline at end of file diff --git a/src/Meta/Postgres/Schema.php b/src/Meta/Postgres/Schema.php index abe2c455..6f81620f 100644 --- a/src/Meta/Postgres/Schema.php +++ b/src/Meta/Postgres/Schema.php @@ -268,18 +268,12 @@ protected function wrap($table) /** * @param \Illuminate\Database\Connection $connection - * + * @deprecated use \Reliese\Meta\Postgres\Database::getSchemaNames * @return array */ public static function schemas(Connection $connection) { - $schemas = $connection->getDoctrineSchemaManager()->listDatabases(); - - return array_diff($schemas, [ - 'postgres', - 'template0', - 'template1', - ]); + return (new Database($connection))->getSchemaNames(); } /** diff --git a/src/Meta/Sqlite/Database.php b/src/Meta/Sqlite/Database.php new file mode 100644 index 00000000..69c9858b --- /dev/null +++ b/src/Meta/Sqlite/Database.php @@ -0,0 +1,27 @@ +connection = $connection; + } + + /** + * @inheritDoc + */ + public function getSchemaNames() + { + return ['database']; + } +} \ No newline at end of file diff --git a/src/Meta/Sqlite/Schema.php b/src/Meta/Sqlite/Schema.php index 7c611692..f42568b7 100644 --- a/src/Meta/Sqlite/Schema.php +++ b/src/Meta/Sqlite/Schema.php @@ -194,12 +194,12 @@ protected function fillRelations(Blueprint $blueprint) /** * @param \Illuminate\Database\Connection $connection - * + * @deprecated use \Reliese\Meta\Sqlite\Database::getSchemaNames * @return array */ public static function schemas(Connection $connection) { - return ['database']; + return (new Database($connection))->getSchemaNames(); } /** From dd8952667a6d8b799fe8b099c98e93b82c55cfc0 Mon Sep 17 00:00:00 2001 From: Adam Lenda Date: Fri, 26 Mar 2021 16:17:21 -0400 Subject: [PATCH 2/5] added file omitted from prior commit --- src/Meta/DatabaseInterface.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/Meta/DatabaseInterface.php diff --git a/src/Meta/DatabaseInterface.php b/src/Meta/DatabaseInterface.php new file mode 100644 index 00000000..290d2a64 --- /dev/null +++ b/src/Meta/DatabaseInterface.php @@ -0,0 +1,16 @@ + Date: Fri, 26 Mar 2021 16:19:33 -0400 Subject: [PATCH 3/5] added implements statements for DatabaseAdapterInterface --- src/Meta/MySql/Database.php | 4 +++- src/Meta/Postgres/Database.php | 4 +++- src/Meta/Sqlite/Database.php | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Meta/MySql/Database.php b/src/Meta/MySql/Database.php index 4b3ab03f..61932429 100644 --- a/src/Meta/MySql/Database.php +++ b/src/Meta/MySql/Database.php @@ -2,12 +2,14 @@ namespace Reliese\Meta\MySql; +use Reliese\Meta\DatabaseInterface; + use function array_diff; /** * Class Database */ -class Database +class Database implements DatabaseInterface { /** * @var \Illuminate\Database\Connection diff --git a/src/Meta/Postgres/Database.php b/src/Meta/Postgres/Database.php index e6295fd3..5860905e 100644 --- a/src/Meta/Postgres/Database.php +++ b/src/Meta/Postgres/Database.php @@ -2,12 +2,14 @@ namespace Reliese\Meta\Postgres; +use Reliese\Meta\DatabaseInterface; + use function array_diff; /** * Class Database */ -class Database +class Database implements DatabaseInterface { /** * @var \Illuminate\Database\Connection diff --git a/src/Meta/Sqlite/Database.php b/src/Meta/Sqlite/Database.php index 69c9858b..fdbf4109 100644 --- a/src/Meta/Sqlite/Database.php +++ b/src/Meta/Sqlite/Database.php @@ -2,10 +2,12 @@ namespace Reliese\Meta\Sqlite; +use Reliese\Meta\DatabaseInterface; + /** * Class Database */ -class Database +class Database implements DatabaseInterface { /** * @var \Illuminate\Database\Connection From ce917b61a27c395ced4bfa22055744948c279f0f Mon Sep 17 00:00:00 2001 From: Adam Lenda Date: Fri, 26 Mar 2021 17:09:35 -0400 Subject: [PATCH 4/5] Added Adapter Factory --- src/Meta/AdapterFactory.php | 43 ++++++++++++++++++++++++++++++++++ src/Meta/DatabaseInterface.php | 8 +++++++ src/Meta/MySql/Database.php | 25 ++++++++++++++++++-- src/Meta/Postgres/Database.php | 25 ++++++++++++++++++-- src/Meta/Sqlite/Database.php | 25 ++++++++++++++++++-- src/Meta/Sqlite/Schema.php | 2 +- 6 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 src/Meta/AdapterFactory.php diff --git a/src/Meta/AdapterFactory.php b/src/Meta/AdapterFactory.php new file mode 100644 index 00000000..7e1a474b --- /dev/null +++ b/src/Meta/AdapterFactory.php @@ -0,0 +1,43 @@ +connection = $connection; } @@ -35,4 +44,16 @@ public function getSchemaNames() 'performance_schema', ]); } + + /** + * @param string $schemaName + * @return Schema + */ + public function getSchema($schemaName) + { + if (!empty($this->schemaAdapters[$schemaName])) { + return $this->schemaAdapters[$schemaName]; + } + return $this->schemaAdapters[$schemaName] = new Schema($schemaName, $this->connection); + } } \ No newline at end of file diff --git a/src/Meta/Postgres/Database.php b/src/Meta/Postgres/Database.php index 5860905e..243e2004 100644 --- a/src/Meta/Postgres/Database.php +++ b/src/Meta/Postgres/Database.php @@ -12,11 +12,20 @@ class Database implements DatabaseInterface { /** - * @var \Illuminate\Database\Connection + * @var Schema[] + */ + private $schemaAdapters = []; + + /** + * @var \Illuminate\Database\PostgresConnection */ private $connection; - public function __construct(\Illuminate\Database\Connection $connection) + /** + * Database constructor. + * @param \Illuminate\Database\PostgresConnection $connection + */ + public function __construct(\Illuminate\Database\PostgresConnection $connection) { $this->connection = $connection; } @@ -34,4 +43,16 @@ public function getSchemaNames() 'template1', ]); } + + /** + * @param string $schemaName + * @return Schema + */ + public function getSchema($schemaName) + { + if (!empty($this->schemaAdapters[$schemaName])) { + return $this->schemaAdapters[$schemaName]; + } + return $this->schemaAdapters[$schemaName] = new Schema($schemaName, $this->connection); + } } \ No newline at end of file diff --git a/src/Meta/Sqlite/Database.php b/src/Meta/Sqlite/Database.php index fdbf4109..b4376cfe 100644 --- a/src/Meta/Sqlite/Database.php +++ b/src/Meta/Sqlite/Database.php @@ -10,11 +10,20 @@ class Database implements DatabaseInterface { /** - * @var \Illuminate\Database\Connection + * @var Schema[] + */ + private $schemaAdapters = []; + + /** + * @var \Illuminate\Database\SQLiteConnection */ private $connection; - public function __construct(\Illuminate\Database\Connection $connection) + /** + * Database constructor. + * @param \Illuminate\Database\SQLiteConnection $connection + */ + public function __construct(\Illuminate\Database\SQLiteConnection $connection) { $this->connection = $connection; } @@ -26,4 +35,16 @@ public function getSchemaNames() { return ['database']; } + + /** + * @param string $schemaName + * @return Schema + */ + public function getSchema($schemaName) + { + if (!empty($this->schemaAdapters[$schemaName])) { + return $this->schemaAdapters[$schemaName]; + } + return $this->schemaAdapters[$schemaName] = new Schema($schemaName, $this->connection); + } } \ No newline at end of file diff --git a/src/Meta/Sqlite/Schema.php b/src/Meta/Sqlite/Schema.php index f42568b7..9f99e0c2 100644 --- a/src/Meta/Sqlite/Schema.php +++ b/src/Meta/Sqlite/Schema.php @@ -36,7 +36,7 @@ class Schema implements \Reliese\Meta\Schema * Mapper constructor. * * @param string $schema - * @param \Illuminate\Database\MySqlConnection $connection + * @param \Illuminate\Database\SQLiteConnection $connection */ public function __construct($schema, $connection) { From 90b439ac8ed6f8be57c459d85ccf79dff0512a14 Mon Sep 17 00:00:00 2001 From: Adam Lenda Date: Fri, 26 Mar 2021 17:13:10 -0400 Subject: [PATCH 5/5] Added Blueprints namespace to expand the existing Blueprint class into a Database, Schema and Table blueprint --- src/Blueprint/BlueprintFactory.php | 80 +++++++++++++++++++++++++++ src/Blueprint/DatabaseBlueprint.php | 77 ++++++++++++++++++++++++++ src/Blueprint/SchemaBlueprint.php | 85 +++++++++++++++++++++++++++++ src/Blueprint/TableBlueprint.php | 40 ++++++++++++++ 4 files changed, 282 insertions(+) create mode 100644 src/Blueprint/BlueprintFactory.php create mode 100644 src/Blueprint/DatabaseBlueprint.php create mode 100644 src/Blueprint/SchemaBlueprint.php create mode 100644 src/Blueprint/TableBlueprint.php diff --git a/src/Blueprint/BlueprintFactory.php b/src/Blueprint/BlueprintFactory.php new file mode 100644 index 00000000..e1d51bcb --- /dev/null +++ b/src/Blueprint/BlueprintFactory.php @@ -0,0 +1,80 @@ +laravelDatabaseManager = $databaseManager; + $this->config = $config; + $this->adapterFactory = $adapterFactory; + } + + /** + * @param $connectionName + * @return DatabaseBlueprint + */ + public function database($connectionName) + { + if (!empty($this->databaseBlueprints[$connectionName])) { + return $this->databaseBlueprints[$connectionName]; + } + + $connection = $this->laravelDatabaseManager->connection($connectionName); + + $databaseBlueprint = new DatabaseBlueprint( + $this->adapterFactory->database($connection), + $connectionName, + $connection + ); + + return $this->databaseBlueprints[$connectionName] = $databaseBlueprint; + } +} \ No newline at end of file diff --git a/src/Blueprint/DatabaseBlueprint.php b/src/Blueprint/DatabaseBlueprint.php new file mode 100644 index 00000000..7028353d --- /dev/null +++ b/src/Blueprint/DatabaseBlueprint.php @@ -0,0 +1,77 @@ +connectionName = $connectionName; + $this->connection = $connection; + $this->databaseAdapter = $databaseAdapter; + } + + /** + * If a schema name is not provided, then the default schema for the connection will be used + * @param string|null $schemaName + * @return SchemaBlueprint + */ + public function schema($schemaName) + { + if (!empty($this->schemaBlueprints[$schemaName])) { + return $this->schemaBlueprints[$schemaName]; + } + + return $this->schemaBlueprints[$schemaName] = new SchemaBlueprint( + $this, + $this->databaseAdapter->getSchema($schemaName), + $schemaName + ); + } + + # region Accessors + /** + * @return \Illuminate\Database\Connection + */ + public function getConnection() + { + return $this->connection; + } + # endregion Accessors +} \ No newline at end of file diff --git a/src/Blueprint/SchemaBlueprint.php b/src/Blueprint/SchemaBlueprint.php new file mode 100644 index 00000000..206f6e01 --- /dev/null +++ b/src/Blueprint/SchemaBlueprint.php @@ -0,0 +1,85 @@ +schemaAdapter = $schemaAdapter; + $this->schemaName = $schemaName; + $this->databaseBlueprint = $databaseBlueprint; + + $this->schemaManager = new SchemaManager( + $databaseBlueprint->getConnection() + ); + } + + public function table($tableName) + { + if (!empty($this->tableBlueprints[$tableName])) { + return $this->tableBlueprints[$tableName]; + } + + $blueprint = $this->schemaAdapter->table($tableName); + + return $this->tableBlueprints[$tableName] = new TableBlueprint( + $this, + $tableName, + $blueprint + ); + } + + public function schemaAdapter() + { + + } + + # region Accessors + + # endregion Accessors +} \ No newline at end of file diff --git a/src/Blueprint/TableBlueprint.php b/src/Blueprint/TableBlueprint.php new file mode 100644 index 00000000..50f5462b --- /dev/null +++ b/src/Blueprint/TableBlueprint.php @@ -0,0 +1,40 @@ +tableName = $tableName; + $this->schemaBlueprint = $schemaBlueprint; + $this->deprecatedTableBlueprint = $depricatedTableBlueprint; + } +} \ No newline at end of file