From d05197039c4c78ad5ced48f85fe5a4ca39199fd4 Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 17:04:18 +0530 Subject: [PATCH 1/8] [8.x] Add DB command to open the database CLI --- src/Illuminate/Database/Console/DbCommand.php | 195 ++++++++++++++++++ .../Providers/ArtisanServiceProvider.php | 12 ++ 2 files changed, 207 insertions(+) create mode 100644 src/Illuminate/Database/Console/DbCommand.php diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php new file mode 100644 index 000000000000..c8391a975ed7 --- /dev/null +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -0,0 +1,195 @@ +getConnection(); + + (new Process( + [$this->getCommand($connection), ...$this->getArgs($connection)], + null, $this->getEnv($connection) + ))->setTimeout(null)->setTty(true)->mustRun(function ($type, $buffer) { + $this->output->write($buffer); + }); + + return 0; + } + + /** + * Get the database connection configuration. + * + * @return array + */ + public function getConnection() + { + $connection = $this->laravel['config']['database.connections.'. + (($db = $this->option('database')) ?? $this->laravel['config']['database.default']) + ]; + + if (empty($connection)) { + throw new UnexpectedValueException("Invalid database connection: [{$db}]."); + } + + return $connection; + } + + /** + * Get the arguments for the database client command. + * + * @param array $connection + * @return string + */ + public function getArgs($connection) + { + $driver = ucfirst($connection['driver']); + + return $this->{"get{$driver}Args"}($connection); + } + + /** + * Get the environmental variables for the database client command. + * + * @param array $connection + * @return array|null + */ + public function getEnv($connection) + { + $driver = ucfirst($connection['driver']); + + if (method_exists($this, "get{$driver}Env")) { + return $this->{"get{$driver}Env"}($connection); + } + + return null; + } + + /** + * Get the database client command to run. + * + * @param array $connection + * @return string + */ + public function getCommand($connection) + { + return [ + 'mysql' => 'mysql', + 'pgsql' => 'psql', + 'sqlite' => 'sqlite3', + 'sqlsrv' => 'sqlcmd', + ][$connection['driver']]; + } + + /** + * Get the arguments for the mysql CLI. + * + * @param array $connection + * @return array + */ + protected function getMysqlArgs($connection) + { + return array_merge([ + '--host='.$connection['host'], + '--port='.$connection['port'], + '--user='.$connection['username'], + ], $this->buildOptionalArguments([ + 'password' => '--password='.$connection['password'], + 'unix_socket' => '--socket='.$connection['unix_socket'], + 'charset' => '--default-character-set='.$connection['charset'], + ], $connection), [$connection['database']]); + } + + /** + * Get the arguments for the pgsql CLI. + * + * @param array $connection + * @return array + */ + protected function getPgsqlArgs($connection) + { + return [$connection['database']]; + } + + /** + * Get the arguments for the sqlite CLI. + * + * @param array $connection + * @return array + */ + protected function getSqliteArgs($connection) + { + return [$connection['database']]; + } + + /** + * Get the arguments for the sqlite CLI. + * + * @param array $connection + * @return array + */ + protected function getSqlsrvArgs($connection) + { + return $this->buildOptionalArguments([ + 'database' => '-d '.$connection['database'], + 'username' => '-U '.$connection['username'], + 'password' => '-P '.$connection['password'], + 'host' => '-S tcp:'.$connection['host'] + .($connection['port'] ? ','.$connection['port'] : ''), + ], $connection); + } + + /** + * Get the environmental variables for the pgsql CLI. + * + * @param array $connection + * @return array|null + */ + protected function getpgsqlEnv($connection) + { + return array_merge(...$this->buildOptionalArguments([ + 'username' => ['PGUSER' => $connection['username']], + 'host' => ['PGHOST' => $connection['host']], + 'port' => ['PGPORT' => $connection['port']], + 'password' => ['PGPASSWORD' => $connection['password']], + ], $connection)); + } + + /** + * Build optional arguments based on the connection configuration. + * + * @param array $args + * @param array $connection + * @return array + */ + protected function buildOptionalArguments($args, $connection) + { + return array_values(array_filter($args, function ($key) use ($connection) { + return ! empty($connection[$key]); + }, ARRAY_FILTER_USE_KEY)); + } +} diff --git a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php index dc82ba1df83c..7fee3cf38026 100755 --- a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php @@ -14,6 +14,7 @@ use Illuminate\Database\Console\Factories\FactoryMakeCommand; use Illuminate\Database\Console\Seeds\SeedCommand; use Illuminate\Database\Console\Seeds\SeederMakeCommand; +use Illuminate\Database\Console\DbCommand; use Illuminate\Database\Console\WipeCommand; use Illuminate\Foundation\Console\CastMakeCommand; use Illuminate\Foundation\Console\ChannelMakeCommand; @@ -88,6 +89,7 @@ class ArtisanServiceProvider extends ServiceProvider implements DeferrableProvid 'ClearResets' => 'command.auth.resets.clear', 'ConfigCache' => 'command.config.cache', 'ConfigClear' => 'command.config.clear', + 'Db' => DbCommand::class, 'DbWipe' => 'command.db.wipe', 'Down' => 'command.down', 'Environment' => 'command.environment', @@ -332,6 +334,16 @@ protected function registerControllerMakeCommand() }); } + /** + * Register the command. + * + * @return void + */ + protected function registerDbCommand() + { + $this->app->singleton(DbCommand::class); + } + /** * Register the command. * From 696a1d3537a67f484e51345a7a852607c2597714 Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 17:29:12 +0530 Subject: [PATCH 2/8] fix styleci --- src/Illuminate/Database/Console/DbCommand.php | 2 +- src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php index c8391a975ed7..cd5ba54be574 100644 --- a/src/Illuminate/Database/Console/DbCommand.php +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -2,9 +2,9 @@ namespace Illuminate\Database\Console; -use UnexpectedValueException; use Illuminate\Console\Command; use Symfony\Component\Process\Process; +use UnexpectedValueException; class DbCommand extends Command { diff --git a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php index 7fee3cf38026..c4d31671075d 100755 --- a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php @@ -10,11 +10,11 @@ use Illuminate\Console\Scheduling\ScheduleRunCommand; use Illuminate\Console\Scheduling\ScheduleWorkCommand; use Illuminate\Contracts\Support\DeferrableProvider; +use Illuminate\Database\Console\DbCommand; use Illuminate\Database\Console\DumpCommand; use Illuminate\Database\Console\Factories\FactoryMakeCommand; use Illuminate\Database\Console\Seeds\SeedCommand; use Illuminate\Database\Console\Seeds\SeederMakeCommand; -use Illuminate\Database\Console\DbCommand; use Illuminate\Database\Console\WipeCommand; use Illuminate\Foundation\Console\CastMakeCommand; use Illuminate\Foundation\Console\ChannelMakeCommand; From 6d401d2cd43cc7a992486840aab7bfa304e566bf Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 17:44:51 +0530 Subject: [PATCH 3/8] fix php 7.3 compatibility with spread operator --- src/Illuminate/Database/Console/DbCommand.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php index cd5ba54be574..cb9774db2db6 100644 --- a/src/Illuminate/Database/Console/DbCommand.php +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -32,7 +32,7 @@ public function handle() $connection = $this->getConnection(); (new Process( - [$this->getCommand($connection), ...$this->getArgs($connection)], + array_merge([$this->getCommand($connection)], $this->getArgs($connection)), null, $this->getEnv($connection) ))->setTimeout(null)->setTty(true)->mustRun(function ($type, $buffer) { $this->output->write($buffer); @@ -63,7 +63,7 @@ public function getConnection() * Get the arguments for the database client command. * * @param array $connection - * @return string + * @return array */ public function getArgs($connection) { From 3bf0ee51fa59a71bba16ba91e3bce45c88af6f5a Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 18:09:54 +0530 Subject: [PATCH 4/8] fix typo in docblock --- src/Illuminate/Database/Console/DbCommand.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php index cb9774db2db6..f158d249aa20 100644 --- a/src/Illuminate/Database/Console/DbCommand.php +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -20,7 +20,7 @@ class DbCommand extends Command * * @var string */ - protected $description = 'Open the database CLI'; + protected $description = 'Drop into the database CLI.'; /** * Execute the console command. @@ -147,7 +147,7 @@ protected function getSqliteArgs($connection) } /** - * Get the arguments for the sqlite CLI. + * Get the arguments for the SQL Server CLI. * * @param array $connection * @return array From 1b348b47d2bde511a1d8ab92f8171e0eb971ad82 Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 19:26:09 +0530 Subject: [PATCH 5/8] Change database option to argument and rename to connection --- src/Illuminate/Database/Console/DbCommand.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php index f158d249aa20..962839d8b095 100644 --- a/src/Illuminate/Database/Console/DbCommand.php +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -13,7 +13,7 @@ class DbCommand extends Command * * @var string */ - protected $signature = 'db {--database= : The database connection to use}'; + protected $signature = 'db {connection? : The database connection to use}'; /** * The console command description. @@ -49,7 +49,7 @@ public function handle() public function getConnection() { $connection = $this->laravel['config']['database.connections.'. - (($db = $this->option('database')) ?? $this->laravel['config']['database.default']) + (($db = $this->argument('connection')) ?? $this->laravel['config']['database.default']) ]; if (empty($connection)) { From a6385ce2d7a33c76d58af919152c1dd911700af9 Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 19:34:27 +0530 Subject: [PATCH 6/8] formatting --- src/Illuminate/Database/Console/DbCommand.php | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php index 962839d8b095..d0460699dfed 100644 --- a/src/Illuminate/Database/Console/DbCommand.php +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -65,7 +65,7 @@ public function getConnection() * @param array $connection * @return array */ - public function getArgs($connection) + public function getArgs(array $connection) { $driver = ucfirst($connection['driver']); @@ -78,7 +78,7 @@ public function getArgs($connection) * @param array $connection * @return array|null */ - public function getEnv($connection) + public function getEnv(array $connection) { $driver = ucfirst($connection['driver']); @@ -95,13 +95,13 @@ public function getEnv($connection) * @param array $connection * @return string */ - public function getCommand($connection) + public function getCommand(array $connection) { return [ - 'mysql' => 'mysql', - 'pgsql' => 'psql', - 'sqlite' => 'sqlite3', - 'sqlsrv' => 'sqlcmd', + 'mysql' => 'mysql', + 'pgsql' => 'psql', + 'sqlite' => 'sqlite3', + 'sqlsrv' => 'sqlcmd', ][$connection['driver']]; } @@ -111,16 +111,16 @@ public function getCommand($connection) * @param array $connection * @return array */ - protected function getMysqlArgs($connection) + protected function getMysqlArgs(array $connection) { return array_merge([ '--host='.$connection['host'], '--port='.$connection['port'], '--user='.$connection['username'], ], $this->buildOptionalArguments([ - 'password' => '--password='.$connection['password'], - 'unix_socket' => '--socket='.$connection['unix_socket'], - 'charset' => '--default-character-set='.$connection['charset'], + 'password' => '--password='.$connection['password'], + 'unix_socket' => '--socket='.$connection['unix_socket'], + 'charset' => '--default-character-set='.$connection['charset'], ], $connection), [$connection['database']]); } @@ -130,7 +130,7 @@ protected function getMysqlArgs($connection) * @param array $connection * @return array */ - protected function getPgsqlArgs($connection) + protected function getPgsqlArgs(array $connection) { return [$connection['database']]; } @@ -141,7 +141,7 @@ protected function getPgsqlArgs($connection) * @param array $connection * @return array */ - protected function getSqliteArgs($connection) + protected function getSqliteArgs(array $connection) { return [$connection['database']]; } @@ -152,14 +152,14 @@ protected function getSqliteArgs($connection) * @param array $connection * @return array */ - protected function getSqlsrvArgs($connection) + protected function getSqlsrvArgs(array $connection) { return $this->buildOptionalArguments([ - 'database' => '-d '.$connection['database'], - 'username' => '-U '.$connection['username'], - 'password' => '-P '.$connection['password'], - 'host' => '-S tcp:'.$connection['host'] - .($connection['port'] ? ','.$connection['port'] : ''), + 'database' => '-d '.$connection['database'], + 'username' => '-U '.$connection['username'], + 'password' => '-P '.$connection['password'], + 'host' => '-S tcp:'.$connection['host'] + .($connection['port'] ? ','.$connection['port'] : ''), ], $connection); } @@ -169,13 +169,13 @@ protected function getSqlsrvArgs($connection) * @param array $connection * @return array|null */ - protected function getpgsqlEnv($connection) + protected function getpgsqlEnv(array $connection) { return array_merge(...$this->buildOptionalArguments([ - 'username' => ['PGUSER' => $connection['username']], - 'host' => ['PGHOST' => $connection['host']], - 'port' => ['PGPORT' => $connection['port']], - 'password' => ['PGPASSWORD' => $connection['password']], + 'username' => ['PGUSER' => $connection['username']], + 'host' => ['PGHOST' => $connection['host']], + 'port' => ['PGPORT' => $connection['port']], + 'password' => ['PGPASSWORD' => $connection['password']], ], $connection)); } @@ -186,7 +186,7 @@ protected function getpgsqlEnv($connection) * @param array $connection * @return array */ - protected function buildOptionalArguments($args, $connection) + protected function buildOptionalArguments(array $args,array $connection) { return array_values(array_filter($args, function ($key) use ($connection) { return ! empty($connection[$key]); From e40ce91a438900e560880b4f2548fa46479f141b Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 19:35:48 +0530 Subject: [PATCH 7/8] styleci --- src/Illuminate/Database/Console/DbCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php index d0460699dfed..7d60cf272d52 100644 --- a/src/Illuminate/Database/Console/DbCommand.php +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -186,7 +186,7 @@ protected function getpgsqlEnv(array $connection) * @param array $connection * @return array */ - protected function buildOptionalArguments(array $args,array $connection) + protected function buildOptionalArguments(array $args, array $connection) { return array_values(array_filter($args, function ($key) use ($connection) { return ! empty($connection[$key]); From 94d0caad634badca3c23214bba2961daf76b88c8 Mon Sep 17 00:00:00 2001 From: Paras Malhotra Date: Fri, 20 Nov 2020 20:01:11 +0530 Subject: [PATCH 8/8] typo fix --- src/Illuminate/Database/Console/DbCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Console/DbCommand.php b/src/Illuminate/Database/Console/DbCommand.php index 7d60cf272d52..5a50049773bb 100644 --- a/src/Illuminate/Database/Console/DbCommand.php +++ b/src/Illuminate/Database/Console/DbCommand.php @@ -169,7 +169,7 @@ protected function getSqlsrvArgs(array $connection) * @param array $connection * @return array|null */ - protected function getpgsqlEnv(array $connection) + protected function getPgsqlEnv(array $connection) { return array_merge(...$this->buildOptionalArguments([ 'username' => ['PGUSER' => $connection['username']],