Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
25.00% |
1 / 4 |
CRAP | |
53.33% |
8 / 15 |
Transaction | |
0.00% |
0 / 1 |
|
25.00% |
1 / 4 |
11.98 | |
53.33% |
8 / 15 |
__construct | |
0.00% |
0 / 1 |
3.47 | |
62.50% |
5 / 8 |
|||
__destruct | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
name | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
rollback | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Database\Transaction. | |
*/ | |
namespace Drupal\Core\Database; | |
/** | |
* A wrapper class for creating and managing database transactions. | |
* | |
* Not all databases or database configurations support transactions. For | |
* example, MySQL MyISAM tables do not. It is also easy to begin a transaction | |
* and then forget to commit it, which can lead to connection errors when | |
* another transaction is started. | |
* | |
* This class acts as a wrapper for transactions. To begin a transaction, | |
* simply instantiate it. When the object goes out of scope and is destroyed | |
* it will automatically commit. It also will check to see if the specified | |
* connection supports transactions. If not, it will simply skip any transaction | |
* commands, allowing user-space code to proceed normally. The only difference | |
* is that rollbacks won't actually do anything. | |
* | |
* In the vast majority of cases, you should not instantiate this class | |
* directly. Instead, call ->startTransaction(), from the appropriate connection | |
* object. | |
*/ | |
class Transaction { | |
/** | |
* The connection object for this transaction. | |
* | |
* @var \Drupal\Core\Database\Connection | |
*/ | |
protected $connection; | |
/** | |
* A boolean value to indicate whether this transaction has been rolled back. | |
* | |
* @var bool | |
*/ | |
protected $rolledBack = FALSE; | |
/** | |
* The name of the transaction. | |
* | |
* This is used to label the transaction savepoint. It will be overridden to | |
* 'drupal_transaction' if there is no transaction depth. | |
*/ | |
protected $name; | |
public function __construct(Connection $connection, $name = NULL) { | |
$this->connection = $connection; | |
// If there is no transaction depth, then no transaction has started. Name | |
// the transaction 'drupal_transaction'. | |
if (!$depth = $connection->transactionDepth()) { | |
$this->name = 'drupal_transaction'; | |
} | |
// Within transactions, savepoints are used. Each savepoint requires a | |
// name. So if no name is present we need to create one. | |
elseif (!$name) { | |
$this->name = 'savepoint_' . $depth; | |
} | |
else { | |
$this->name = $name; | |
} | |
$this->connection->pushTransaction($this->name); | |
} | |
public function __destruct() { | |
// If we rolled back then the transaction would have already been popped. | |
if (!$this->rolledBack) { | |
$this->connection->popTransaction($this->name); | |
} | |
} | |
/** | |
* Retrieves the name of the transaction or savepoint. | |
*/ | |
public function name() { | |
return $this->name; | |
} | |
/** | |
* Rolls back the current transaction. | |
* | |
* This is just a wrapper method to rollback whatever transaction stack we are | |
* currently in, which is managed by the connection object itself. Note that | |
* logging (preferable with watchdog_exception()) needs to happen after a | |
* transaction has been rolled back or the log messages will be rolled back | |
* too. | |
* | |
* @see \Drupal\Core\Database\Connection::rollback() | |
* @see watchdog_exception() | |
*/ | |
public function rollback() { | |
$this->rolledBack = TRUE; | |
$this->connection->rollback($this->name); | |
} | |
} |