/**
  * Test commit.
  *
  * @param Operation $operation
  *   The operation to perform tests on.
  *
  * @dataProvider operationDataProvider
  */
 public function testCommit(Operation $operation)
 {
     $performed = false;
     $callback = function () use(&$performed) {
         $performed = true;
         return 'performed';
     };
     $operation->onCommit($callback);
     $check = $operation->getCommitCallbacks();
     $this->assertSame($callback, reset($check), 'Correct callback was not set.');
     $operation->commit();
     $this->assertTrue($performed, 'Callback was not executed.');
     $check = $operation->getResult();
     $this->assertSame('performed', $check, 'Callback did not return proper result.');
 }
 /**
  * Test index.
  *
  * @param Connection $connection
  *   The connection to perform tests on.
  *
  * @dataProvider connectionDataProvider
  */
 public function testIndex(Connection $connection)
 {
     $indexer = new Indexer($connection);
     $connection->startTransaction();
     $indexer->index($connection->addMetadata('value', 'value1'), 'test1');
     $check = $indexer->lookup('test1');
     $this->assertSame('value1', reset($check)->getMetadata('value'), 'Operations not found during lookup.');
     $operation = new Operation();
     $operation->onCommit(function () {
         return 'testresult';
     });
     $connection->addOperation($operation);
     $indexer->index($operation, 'test2');
     $check = $indexer->lookup('test2');
     $this->assertSame([$operation->idx($connection) => $operation], $check, 'Operations not found during lookup.');
 }
 /**
  * Test rollback transaction.
  *
  * @param Connection $connection
  *   The connection to perform tests on.
  *
  * @dataProvider connectionDataProvider
  */
 public function testRollbackTransaction(Connection $connection)
 {
     $operation = new Operation();
     $operation->onCommit(function () use(&$committed) {
         $committed = true;
     });
     $operation->onRollback(function () use(&$rolledback) {
         $rolledback = true;
     });
     $committed = false;
     $rolledback = false;
     $connection->startTransaction();
     $connection->addOperation($operation);
     $connection->rollbackTransaction();
     $this->assertFalse($committed, 'Commit was performed.');
     $this->assertTrue($rolledback, 'Rollback was not performed.');
     $committed = false;
     $rolledback = false;
     $connection->startTransaction();
     $connection->startTransaction();
     $connection->addOperation($operation);
     $connection->rollbackTransaction();
     $connection->commitTransaction();
     $this->assertFalse($committed, 'Commit was performed.');
     $this->assertTrue($rolledback, 'Rollback was not performed.');
     $committed = false;
     $rolledback = false;
     $connection->startTransaction();
     $connection->startTransaction();
     $connection->addOperation($operation);
     $connection->commitTransaction();
     $connection->rollbackTransaction();
     $this->assertFalse($committed, 'Commit was performed.');
     $this->assertTrue($rolledback, 'Rollback was not performed.');
 }
use Gielfeldt\TransactionalPHP\Operation;
$connection = new Connection();
$operation = new Operation();
$operation->onCommit(function () {
    print "THIS WILL BE PRINTED IMMEDIATELY, BECAUSE NO TRANSACTION HAS BEGUN\n";
})->onRollback(function () {
    print "THIS WILL NEVER BE PRINTED, BECAUSE NO TRANSACTION HAS BEGUN\n";
});
$connection->addOperation($operation);
// Start outer transaction.
$connection->startTransaction();
$operation = new Operation();
$operation->onCommit(function () {
    print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n";
})->onRollback(function () {
    print "THIS WILL NEVER BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n";
});
$connection->addOperation($operation);
// Start inner transaction.
$connection->startTransaction();
$operation = new Operation();
$operation->onCommit(function () {
    print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n";
})->onRollback(function () {
    print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n";
});
$connection->addOperation($operation);
// Rollback inner transaction.
$connection->rollbackTransaction();
// Commit inner transaction.
$connection->commitTransaction();