diff --git a/core/lib/Drupal/Core/Database/Connection.php b/core/lib/Drupal/Core/Database/Connection.php index 7d12118..b502fdb 100644 --- a/core/lib/Drupal/Core/Database/Connection.php +++ b/core/lib/Drupal/Core/Database/Connection.php @@ -1249,19 +1249,22 @@ public function quote($string, $parameter_type = \PDO::PARAM_STR) { * {@inheritdoc} */ public function serialize() { - // Just store the target and the key of the connection because this is all - // what drupal needs to get a proper connection running again. - return serialize(array($this->target, $this->key)); + $connection = clone $this; + // Don't serialize the PDO connection. + unset($connection->connection); + return serialize(get_object_vars($connection)); } /** * {@inheritdoc} */ public function unserialize($serialized) { - list($target, $key) = unserialize($serialized); - foreach (get_object_vars(Database::getConnection($target, $key)) as $name => $value) { - $this->{$name} = $value; + $data = unserialize($serialized); + foreach ($data as $key => $value) { + $this->{$key} = $value; } + // Re-establish the PDO connection using the original options. + $this->connection = static::open($this->connectionOptions); } } diff --git a/core/modules/system/lib/Drupal/system/Tests/Database/ConnectionTest.php b/core/modules/system/lib/Drupal/system/Tests/Database/ConnectionTest.php index 18f4c86..85e6aef 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Database/ConnectionTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Database/ConnectionTest.php @@ -130,9 +130,15 @@ function testConnectionOptions() { public function testConnectionSerialization() { $db = Database::getConnection('default', 'default'); - $serialized = serialize($db); - $unserialized = unserialize($serialized); - - $this->assertIdenticalObject($db, $unserialized, 'Serializing and unserializing a connection returns an identical object.'); + try { + $serialized = serialize($db); + $this->pass('The database connection can be serialized.'); + + $unserialized = unserialize($serialized); + $this->assertTrue(get_class($unserialized) === get_class($db)); + } + catch (\Exception $e) { + $this->fail('The database connection cannot be serialized.'); + } } } diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php index ef498e1..f402395 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php @@ -669,8 +669,8 @@ function testMultiFormSameNameErrorClass() { * Tests a form with a form state storing a database connection. */ public function testFormStateDatabaseConnection() { - $this->assertNoText(t('Database connection found')); + $this->assertNoText('Database connection found'); $this->drupalPost('form-test/form_state-database', array(), t('Submit')); - $this->assertText(t('Database connection found')); + $this->assertText('Database connection found'); } } diff --git a/core/modules/system/tests/modules/form_test/form_test.module b/core/modules/system/tests/modules/form_test/form_test.module index afcc3f9..97657a1 100644 --- a/core/modules/system/tests/modules/form_test/form_test.module +++ b/core/modules/system/tests/modules/form_test/form_test.module @@ -2480,7 +2480,6 @@ function form_test_group_vertical_tabs() { * Builds a form which gets the database connection stored in the form state. */ function form_test_form_state_database($form, &$form_state) { - $form['text'] = array( '#type' => 'textfield', '#title' => t('Text field'), @@ -2491,11 +2490,12 @@ function form_test_form_state_database($form, &$form_state) { '#value' => t('Submit'), ); - if (!isset($form_state['storage']['database'])) { - $form_state['storage']['database'] = Database::getConnection('default'); - } - elseif ($form_state['storage']['database'] instanceof Connection) { - $form['database']['#markup'] = t('Database connection found'); + $db = Database::getConnection('default'); + $form_state['storage']['database'] = $db; + $form_state['storage']['database_class'] = get_class($db); + + if (isset($form_state['storage']['database_connection_found'])) { + $form['database']['#markup'] = 'Database connection found'; } return $form; @@ -2506,5 +2506,9 @@ function form_test_form_state_database($form, &$form_state) { */ function form_test_form_state_database_submit($form, &$form_state) { $form_state['cache'] = TRUE; - $form_state['rebuild'] = FALSE; + $form_state['rebuild'] = TRUE; + + if ($form_state['storage']['database'] instanceof $form_state['storage']['database_class']) { + $form_state['storage']['database_connection_found'] = TRUE; + } }