2009-07-17 22:13:03 +04:00
< ? php
2009-07-18 15:41:37 +04:00
namespace Doctrine\Tests\ORM\Functional\Locking ;
2009-07-17 22:13:03 +04:00
use Doctrine\ORM\Mapping\ClassMetadata ;
use Doctrine\Common\EventManager ;
use Doctrine\ORM\Mapping\ClassMetadataFactory ;
use Doctrine\Tests\TestUtil ;
2009-07-18 15:41:37 +04:00
require_once __DIR__ . '/../../../TestInit.php' ;
2009-07-17 22:13:03 +04:00
class OptimisticTest extends \Doctrine\Tests\OrmFunctionalTestCase
{
protected function setUp ()
{
parent :: setUp ();
try {
$this -> _schemaTool -> createSchema ( array (
2009-07-18 15:41:37 +04:00
$this -> _em -> getClassMetadata ( 'Doctrine\Tests\ORM\Functional\Locking\OptimisticJoinedParent' ),
$this -> _em -> getClassMetadata ( 'Doctrine\Tests\ORM\Functional\Locking\OptimisticJoinedChild' ),
2009-08-24 21:06:12 +04:00
$this -> _em -> getClassMetadata ( 'Doctrine\Tests\ORM\Functional\Locking\OptimisticStandard' ),
$this -> _em -> getClassMetadata ( 'Doctrine\Tests\ORM\Functional\Locking\OptimisticTimestamp' )
2009-07-17 22:13:03 +04:00
));
} catch ( \Exception $e ) {
// Swallow all exceptions. We do not test the schema tool here.
}
$this -> _conn = $this -> _em -> getConnection ();
}
2009-07-18 01:55:56 +04:00
public function testJoinedChildInsertSetsInitialVersionValue ()
{
$test = new OptimisticJoinedChild ();
$test -> name = 'child' ;
$test -> whatever = 'whatever' ;
2009-07-19 20:54:53 +04:00
$this -> _em -> persist ( $test );
2009-07-18 01:55:56 +04:00
$this -> _em -> flush ();
$this -> assertEquals ( 1 , $test -> version );
}
/**
* @ expectedException Doctrine\ORM\OptimisticLockException
*/
public function testJoinedChildFailureThrowsException ()
{
2009-07-18 15:41:37 +04:00
$q = $this -> _em -> createQuery ( 'SELECT t FROM Doctrine\Tests\ORM\Functional\Locking\OptimisticJoinedChild t WHERE t.name = :name' );
2009-07-18 01:55:56 +04:00
$q -> setParameter ( 'name' , 'child' );
$test = $q -> getSingleResult ();
// Manually update/increment the version so we can try and save the same
// $test and make sure the exception is thrown saying the record was
// changed or updated since you read it
$this -> _conn -> execute ( 'UPDATE optimistic_joined_parent SET version = ? WHERE id = ?' , array ( 2 , $test -> id ));
// Now lets change a property and try and save it again
$test -> whatever = 'ok' ;
$this -> _em -> flush ();
}
public function testJoinedParentInsertSetsInitialVersionValue ()
2009-07-17 22:13:03 +04:00
{
$test = new OptimisticJoinedParent ();
2009-07-18 01:55:56 +04:00
$test -> name = 'parent' ;
2009-07-19 20:54:53 +04:00
$this -> _em -> persist ( $test );
2009-07-17 22:13:03 +04:00
$this -> _em -> flush ();
$this -> assertEquals ( 1 , $test -> version );
}
/**
* @ expectedException Doctrine\ORM\OptimisticLockException
*/
2009-07-18 01:55:56 +04:00
public function testJoinedParentFailureThrowsException ()
2009-07-17 22:13:03 +04:00
{
2009-07-18 15:41:37 +04:00
$q = $this -> _em -> createQuery ( 'SELECT t FROM Doctrine\Tests\ORM\Functional\Locking\OptimisticJoinedParent t WHERE t.name = :name' );
2009-07-18 01:55:56 +04:00
$q -> setParameter ( 'name' , 'parent' );
2009-07-17 22:13:03 +04:00
$test = $q -> getSingleResult ();
// Manually update/increment the version so we can try and save the same
// $test and make sure the exception is thrown saying the record was
// changed or updated since you read it
$this -> _conn -> execute ( 'UPDATE optimistic_joined_parent SET version = ? WHERE id = ?' , array ( 2 , $test -> id ));
// Now lets change a property and try and save it again
$test -> name = 'WHATT???' ;
$this -> _em -> flush ();
}
public function testStandardInsertSetsInitialVersionValue ()
{
$test = new OptimisticStandard ();
$test -> name = 'test' ;
2009-07-19 20:54:53 +04:00
$this -> _em -> persist ( $test );
2009-07-17 22:13:03 +04:00
$this -> _em -> flush ();
2010-02-14 13:48:25 +03:00
$this -> assertEquals ( 1 , $test -> getVersion ());
2009-07-17 22:13:03 +04:00
}
/**
* @ expectedException Doctrine\ORM\OptimisticLockException
*/
public function testStandardFailureThrowsException ()
{
2009-07-18 15:41:37 +04:00
$q = $this -> _em -> createQuery ( 'SELECT t FROM Doctrine\Tests\ORM\Functional\Locking\OptimisticStandard t WHERE t.name = :name' );
2009-07-17 22:13:03 +04:00
$q -> setParameter ( 'name' , 'test' );
$test = $q -> getSingleResult ();
// Manually update/increment the version so we can try and save the same
// $test and make sure the exception is thrown saying the record was
// changed or updated since you read it
$this -> _conn -> execute ( 'UPDATE optimistic_standard SET version = ? WHERE id = ?' , array ( 2 , $test -> id ));
// Now lets change a property and try and save it again
$test -> name = 'WHATT???' ;
$this -> _em -> flush ();
}
2009-08-24 21:06:12 +04:00
public function testOptimisticTimestampSetsDefaultValue ()
{
$test = new OptimisticTimestamp ();
$test -> name = 'Testing' ;
$this -> _em -> persist ( $test );
$this -> _em -> flush ();
$this -> assertTrue ( strtotime ( $test -> version ) > 0 );
}
/**
* @ expectedException Doctrine\ORM\OptimisticLockException
*/
public function testOptimisticTimestampFailureThrowsException ()
{
$q = $this -> _em -> createQuery ( 'SELECT t FROM Doctrine\Tests\ORM\Functional\Locking\OptimisticTimestamp t WHERE t.name = :name' );
$q -> setParameter ( 'name' , 'Testing' );
$test = $q -> getSingleResult ();
2009-11-30 22:02:05 +03:00
$this -> assertType ( 'DateTime' , $test -> version );
2009-08-24 21:06:12 +04:00
// Manually increment the version datetime column
2009-08-28 21:25:28 +04:00
$format = $this -> _em -> getConnection () -> getDatabasePlatform () -> getDateTimeFormatString ();
$this -> _conn -> execute ( 'UPDATE optimistic_timestamp SET version = ? WHERE id = ?' , array ( date ( $format , strtotime ( $test -> version -> format ( $format )) + 3600 ), $test -> id ));
2009-08-24 21:06:12 +04:00
// Try and update the record and it should throw an exception
$test -> name = 'Testing again' ;
$this -> _em -> flush ();
}
2009-07-17 22:13:03 +04:00
}
/**
* @ Entity
* @ Table ( name = " optimistic_joined_parent " )
* @ InheritanceType ( " JOINED " )
* @ DiscriminatorColumn ( name = " discr " , type = " string " )
2009-08-17 21:58:16 +04:00
* @ DiscriminatorMap ({ " parent " = " OptimisticJoinedParent " , " child " = " OptimisticJoinedChild " })
2009-07-17 22:13:03 +04:00
*/
class OptimisticJoinedParent
{
/**
* @ Id @ Column ( type = " integer " )
* @ GeneratedValue ( strategy = " AUTO " )
*/
public $id ;
/**
* @ Column ( type = " string " , length = 255 )
*/
public $name ;
/**
* @ Version @ Column ( type = " integer " )
*/
public $version ;
}
/**
* @ Entity
* @ Table ( name = " optimistic_joined_child " )
*/
class OptimisticJoinedChild extends OptimisticJoinedParent
{
/**
* @ Column ( type = " string " , length = 255 )
*/
2009-07-18 01:55:56 +04:00
public $whatever ;
2009-07-17 22:13:03 +04:00
}
/**
* @ Entity
* @ Table ( name = " optimistic_standard " )
*/
class OptimisticStandard
{
/**
* @ Id @ Column ( type = " integer " )
* @ GeneratedValue ( strategy = " AUTO " )
*/
public $id ;
/**
* @ Column ( type = " string " , length = 255 )
*/
public $name ;
/**
* @ Version @ Column ( type = " integer " )
*/
2010-02-14 13:48:25 +03:00
private $version ;
function getVersion () { return $this -> version ;}
2009-08-24 21:06:12 +04:00
}
/**
* @ Entity
* @ Table ( name = " optimistic_timestamp " )
*/
class OptimisticTimestamp
{
/**
* @ Id @ Column ( type = " integer " )
* @ GeneratedValue ( strategy = " AUTO " )
*/
public $id ;
/**
* @ Column ( type = " string " , length = 255 )
*/
public $name ;
/**
* @ Version @ Column ( type = " datetime " )
*/
public $version ;
2009-07-17 22:13:03 +04:00
}