From 459d7e82c33fd7102a9c057de9149c229adca70c Mon Sep 17 00:00:00 2001 From: Oleg Khimich Date: Thu, 19 Apr 2018 06:59:07 +0300 Subject: [PATCH 1/5] applied pull request https://github.com/jenssegers/laravel-mongodb/pull/1457 --- src/Jenssegers/Mongodb/Connection.php | 15 +++------------ tests/DsnTest.php | 14 ++++++++++++++ tests/TestCase.php | 1 + tests/config/database.php | 6 ++++++ 4 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 tests/DsnTest.php diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index bbc5c437c..7276155a6 100644 --- a/src/Jenssegers/Mongodb/Connection.php +++ b/src/Jenssegers/Mongodb/Connection.php @@ -4,7 +4,6 @@ use Illuminate\Database\Connection as BaseConnection; use Illuminate\Support\Arr; -use Illuminate\Support\Str; use MongoDB\Client; class Connection extends BaseConnection @@ -151,7 +150,7 @@ public function disconnect() } /** - * Determine if the given configuration array has a UNIX socket value. + * Determine if the given configuration array has a dsn string. * * @param array $config * @return bool @@ -162,22 +161,14 @@ protected function hasDsnString(array $config) } /** - * Get the DSN string for a socket configuration. + * Get the DSN string form configuration. * * @param array $config * @return string */ protected function getDsnString(array $config) { - $dsn_string = $config['dsn']; - - if (Str::contains($dsn_string, 'mongodb://')) { - $dsn_string = Str::replaceFirst('mongodb://', '', $dsn_string); - } - - $dsn_string = rawurlencode($dsn_string); - - return "mongodb://{$dsn_string}"; + return $config['dsn']; } /** diff --git a/tests/DsnTest.php b/tests/DsnTest.php new file mode 100644 index 000000000..08fa0a8aa --- /dev/null +++ b/tests/DsnTest.php @@ -0,0 +1,14 @@ +assertInstanceOf(\Illuminate\Database\Eloquent\Collection::class, DsnAddress::all()); + } +} + +class DsnAddress extends Address +{ + protected $connection = 'dsn_mongodb'; +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 13988623b..f4b26be2d 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -51,6 +51,7 @@ protected function getEnvironmentSetUp($app) $app['config']->set('database.default', 'mongodb'); $app['config']->set('database.connections.mysql', $config['connections']['mysql']); $app['config']->set('database.connections.mongodb', $config['connections']['mongodb']); + $app['config']->set('database.connections.dsn_mongodb', $config['connections']['dsn_mongodb']); $app['config']->set('auth.model', 'User'); $app['config']->set('auth.providers.users.model', 'User'); diff --git a/tests/config/database.php b/tests/config/database.php index 1986807a3..f24d20d2f 100644 --- a/tests/config/database.php +++ b/tests/config/database.php @@ -11,6 +11,12 @@ 'database' => 'unittest', ], + 'dsn_mongodb' => [ + 'driver' => 'mongodb', + 'dsn' => 'mongodb://mongodb:27017', + 'database' => 'unittest', + ], + 'mysql' => [ 'driver' => 'mysql', 'host' => 'mysql', From e1e95a5087fa103f0fd71a1cacab2855d5ba00bc Mon Sep 17 00:00:00 2001 From: Oleg Khimich Date: Thu, 19 Apr 2018 13:02:11 +0300 Subject: [PATCH 2/5] get database from DSN string --- src/Jenssegers/Mongodb/Connection.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index 7276155a6..49adf36ef 100644 --- a/src/Jenssegers/Mongodb/Connection.php +++ b/src/Jenssegers/Mongodb/Connection.php @@ -41,7 +41,7 @@ public function __construct(array $config) $this->connection = $this->createConnection($dsn, $config, $options); // Select database - $this->db = $this->connection->selectDatabase($config['database']); + $this->db = $this->connection->selectDatabase($this->getDatabaseDsn($dsn)); $this->useDefaultPostProcessor(); @@ -191,10 +191,19 @@ protected function getHostDsn(array $config) // Check if we want to authenticate against a specific database. $auth_database = isset($config['options']) && !empty($config['options']['database']) ? $config['options']['database'] : null; - return 'mongodb://' . implode(',', $hosts) . ($auth_database ? '/' . $auth_database : ''); } + /** + * Get database name from DSN string. + * @param string $dsn + * @return string + */ + protected function getDatabaseDsn($dsn) + { + return trim(parse_url($dsn, PHP_URL_PATH), '/'); + } + /** * Create a DSN string from a configuration. * From 068a0af2ce1895730ca6f9fe9f28c4524938e9f7 Mon Sep 17 00:00:00 2001 From: Oleg Khimich Date: Thu, 19 Apr 2018 13:30:15 +0300 Subject: [PATCH 3/5] bugfix: improper database configuration values used --- src/Jenssegers/Mongodb/Connection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index 49adf36ef..157e2e705 100644 --- a/src/Jenssegers/Mongodb/Connection.php +++ b/src/Jenssegers/Mongodb/Connection.php @@ -190,7 +190,7 @@ protected function getHostDsn(array $config) } // Check if we want to authenticate against a specific database. - $auth_database = isset($config['options']) && !empty($config['options']['database']) ? $config['options']['database'] : null; + $auth_database = isset($config['database']) && !empty($config['database']) ? $config['database'] : null; return 'mongodb://' . implode(',', $hosts) . ($auth_database ? '/' . $auth_database : ''); } From 76a5dbc8b1bdcb8d22453ef3f315b7f2f1b1151f Mon Sep 17 00:00:00 2001 From: Oleg Khimich Date: Thu, 19 Apr 2018 13:36:48 +0300 Subject: [PATCH 4/5] bugfix: failover to database configuration values if no ability to get database from DSN --- src/Jenssegers/Mongodb/Connection.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index 157e2e705..f03163820 100644 --- a/src/Jenssegers/Mongodb/Connection.php +++ b/src/Jenssegers/Mongodb/Connection.php @@ -41,7 +41,7 @@ public function __construct(array $config) $this->connection = $this->createConnection($dsn, $config, $options); // Select database - $this->db = $this->connection->selectDatabase($this->getDatabaseDsn($dsn)); + $this->db = $this->connection->selectDatabase($this->getDatabaseDsn($dsn, $config['database'])); $this->useDefaultPostProcessor(); @@ -190,7 +190,7 @@ protected function getHostDsn(array $config) } // Check if we want to authenticate against a specific database. - $auth_database = isset($config['database']) && !empty($config['database']) ? $config['database'] : null; + $auth_database = isset($config['options']) && !empty($config['options']['database']) ? $config['options']['database'] : null; return 'mongodb://' . implode(',', $hosts) . ($auth_database ? '/' . $auth_database : ''); } @@ -199,9 +199,10 @@ protected function getHostDsn(array $config) * @param string $dsn * @return string */ - protected function getDatabaseDsn($dsn) + protected function getDatabaseDsn($dsn, $database) { - return trim(parse_url($dsn, PHP_URL_PATH), '/'); + $dsnDatabase = trim(parse_url($dsn, PHP_URL_PATH), '/'); + return $dsnDatabase?:$database; } /** From 929120f1be1295e0f2575b29f3b8a688fa947327 Mon Sep 17 00:00:00 2001 From: Oleg Khimich Date: Thu, 19 Apr 2018 13:57:51 +0300 Subject: [PATCH 5/5] bugfix: failover to database configuration values if no ability to get database from DSN --- src/Jenssegers/Mongodb/Connection.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index f03163820..b0fd98d0b 100644 --- a/src/Jenssegers/Mongodb/Connection.php +++ b/src/Jenssegers/Mongodb/Connection.php @@ -195,14 +195,15 @@ protected function getHostDsn(array $config) } /** - * Get database name from DSN string. + * Get database name from DSN string, if there is no database in DSN path - returns back $database argument. * @param string $dsn + * @param $database * @return string */ protected function getDatabaseDsn($dsn, $database) { $dsnDatabase = trim(parse_url($dsn, PHP_URL_PATH), '/'); - return $dsnDatabase?:$database; + return trim($dsnDatabase) ? $dsnDatabase : $database; } /**