Skip to content
Snippets Groups Projects
Commit d122ac7c authored by catch's avatar catch
Browse files

Issue #2996441 by andypost, longwave: Replace all calls to db_query_temporary, which is deprecated

parent 1bffa612
No related branches found
No related tags found
2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
...@@ -116,7 +116,7 @@ function db_query_range($query, $from, $count, array $args = [], array $options ...@@ -116,7 +116,7 @@ function db_query_range($query, $from, $count, array $args = [], array $options
* @param array $options * @param array $options
* An array of options to control how the query operates. * An array of options to control how the query operates.
* *
* @return * @return string
* The name of the temporary table. * The name of the temporary table.
* *
* @deprecated as of Drupal 8.0.x, will be removed in Drupal 9.0.0. Instead, get * @deprecated as of Drupal 8.0.x, will be removed in Drupal 9.0.0. Instead, get
...@@ -128,6 +128,7 @@ function db_query_range($query, $from, $count, array $args = [], array $options ...@@ -128,6 +128,7 @@ function db_query_range($query, $from, $count, array $args = [], array $options
* @see \Drupal\Core\Database\Connection::defaultOptions() * @see \Drupal\Core\Database\Connection::defaultOptions()
*/ */
function db_query_temporary($query, array $args = [], array $options = []) { function db_query_temporary($query, array $args = [], array $options = []) {
@trigger_error('db_query_temporary() is deprecated in Drupal 8.0.x and will be removed before Drupal 9.0.0. Instead, get a database connection injected into your service from the container and call queryTemporary() on it. For example, $injected_database->queryTemporary($query, $args, $options). See https://www.drupal.org/node/2993033', E_USER_DEPRECATED);
if (empty($options['target'])) { if (empty($options['target'])) {
$options['target'] = 'default'; $options['target'] = 'default';
} }
......
...@@ -2,15 +2,44 @@ ...@@ -2,15 +2,44 @@
namespace Drupal\database_test\Controller; namespace Drupal\database_test\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Database\Connection;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
/** /**
* Controller routines for database_test routes. * Controller routines for database_test routes.
*/ */
class DatabaseTestController { class DatabaseTestController extends ControllerBase {
/** /**
* Runs db_query_temporary() and outputs the table name and its number of rows. * The database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $connection;
/**
* Constructs a DatabaseTestController object.
*
* @param \Drupal\Core\Database\Connection $connection
* A database connection.
*/
public function __construct(Connection $connection) {
$this->connection = $connection;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('database')
);
}
/**
* Creates temporary table and outputs the table name and its number of rows.
* *
* We need to test that the table created is temporary, so we run it here, in a * We need to test that the table created is temporary, so we run it here, in a
* separate menu callback request; After this request is done, the temporary * separate menu callback request; After this request is done, the temporary
...@@ -19,7 +48,7 @@ class DatabaseTestController { ...@@ -19,7 +48,7 @@ class DatabaseTestController {
* @return \Symfony\Component\HttpFoundation\JsonResponse * @return \Symfony\Component\HttpFoundation\JsonResponse
*/ */
public function dbQueryTemporary() { public function dbQueryTemporary() {
$table_name = db_query_temporary('SELECT age FROM {test}', []); $table_name = $this->connection->queryTemporary('SELECT age FROM {test}', []);
return new JsonResponse([ return new JsonResponse([
'table_name' => $table_name, 'table_name' => $table_name,
'row_count' => db_select($table_name)->countQuery()->execute()->fetchField(), 'row_count' => db_select($table_name)->countQuery()->execute()->fetchField(),
......
...@@ -27,19 +27,20 @@ public function countTableRows($table_name) { ...@@ -27,19 +27,20 @@ public function countTableRows($table_name) {
* Confirms that temporary tables work and are limited to one request. * Confirms that temporary tables work and are limited to one request.
*/ */
public function testTemporaryQuery() { public function testTemporaryQuery() {
$connection = Database::getConnection();
$this->drupalGet('database_test/db_query_temporary'); $this->drupalGet('database_test/db_query_temporary');
$data = json_decode($this->getSession()->getPage()->getContent()); $data = json_decode($this->getSession()->getPage()->getContent());
if ($data) { if ($data) {
$this->assertEqual($this->countTableRows('test'), $data->row_count, 'The temporary table contains the correct amount of rows.'); $this->assertEqual($this->countTableRows('test'), $data->row_count, 'The temporary table contains the correct amount of rows.');
$this->assertFalse(Database::getConnection()->schema()->tableExists($data->table_name), 'The temporary table is, indeed, temporary.'); $this->assertFalse($connection->schema()->tableExists($data->table_name), 'The temporary table is, indeed, temporary.');
} }
else { else {
$this->fail('The creation of the temporary table failed.'); $this->fail('The creation of the temporary table failed.');
} }
// Now try to run two db_query_temporary() in the same request. // Now try to run two db_query_temporary() in the same request.
$table_name_test = db_query_temporary('SELECT name FROM {test}', []); $table_name_test = $connection->queryTemporary('SELECT name FROM {test}', []);
$table_name_task = db_query_temporary('SELECT pid FROM {test_task}', []); $table_name_task = $connection->queryTemporary('SELECT pid FROM {test_task}', []);
$this->assertEqual($this->countTableRows($table_name_test), $this->countTableRows('test'), 'A temporary table was created successfully in this request.'); $this->assertEqual($this->countTableRows($table_name_test), $this->countTableRows('test'), 'A temporary table was created successfully in this request.');
$this->assertEqual($this->countTableRows($table_name_task), $this->countTableRows('test_task'), 'A second temporary table was created successfully in this request.'); $this->assertEqual($this->countTableRows($table_name_task), $this->countTableRows('test_task'), 'A second temporary table was created successfully in this request.');
...@@ -50,7 +51,7 @@ public function testTemporaryQuery() { ...@@ -50,7 +51,7 @@ public function testTemporaryQuery() {
-- Let's select some rows into a temporary table -- Let's select some rows into a temporary table
SELECT name FROM {test} SELECT name FROM {test}
"; ";
$table_name_test = db_query_temporary($sql, []); $table_name_test = $connection->queryTemporary($sql, []);
$this->assertEqual($this->countTableRows($table_name_test), $this->countTableRows('test'), 'Leading white space and comments do not interfere with temporary table creation.'); $this->assertEqual($this->countTableRows($table_name_test), $this->countTableRows('test'), 'Leading white space and comments do not interfere with temporary table creation.');
} }
......
...@@ -386,4 +386,16 @@ public function testDbTruncate() { ...@@ -386,4 +386,16 @@ public function testDbTruncate() {
$this->assertInstanceOf(Truncate::class, db_truncate('test')); $this->assertInstanceOf(Truncate::class, db_truncate('test'));
} }
/**
* Tests deprecation of the db_query_temporary() function.
*
* @expectedDeprecation db_query_temporary() is deprecated in Drupal 8.0.x and will be removed before Drupal 9.0.0. Instead, get a database connection injected into your service from the container and call queryTemporary() on it. For example, $injected_database->queryTemporary($query, $args, $options). See https://www.drupal.org/node/2993033
*/
public function testDbQueryTemporary() {
$expected = $this->connection->select('test')->countQuery()->execute()->fetchField();
$name = db_query_temporary('SELECT name FROM {test}');
$count = $this->connection->select($name)->countQuery()->execute()->fetchField();
$this->assertSame($expected, $count);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment