1
0
mirror of synced 2024-12-05 03:06:05 +03:00

Session flush bug fixed

lots of small bugs fixed
small enhancements
This commit is contained in:
doctrine 2006-05-18 20:44:02 +00:00
parent 94005a9fdd
commit 55f40e6eb3
12 changed files with 372 additions and 46 deletions

View File

@ -221,7 +221,7 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
if( ! isset($offset)) {
foreach($coll as $record) {
if(isset($this->reference_field))
$record->rawSet($this->reference_field,$this->reference);
$record->set($this->reference_field,$this->reference);
$this->reference->addReference($record);
}
@ -332,7 +332,7 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
*/
public function set($key,Doctrine_Record $record) {
if(isset($this->reference_field))
$record->set($this->reference_field,$this->reference);
$record->rawSet($this->reference_field,$this->reference);
$this->data[$key] = $record;
}

View File

@ -486,9 +486,6 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
$fk = $this->table->getForeignKey($name);
if($value->getTable()->getComponentName() != $name)
throw new InvalidKeyException();
// one-to-many or one-to-one relation
if($fk instanceof Doctrine_ForeignKey ||
$fk instanceof Doctrine_LocalKey) {
@ -539,20 +536,20 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
// listen the onPreSave event
$this->table->getAttribute(Doctrine::ATTR_LISTENER)->onPreSave($this);
$saveLater = $this->table->getSession()->saveRelated($this);
$this->table->getSession()->save($this);
foreach($saveLater as $fk) {
$table = $fk->getTable();
$foreign = $fk->getForeign();
$local = $fk->getLocal();
$name = $table->getComponentName();
if(isset($this->references[$name])) {
$obj = $this->references[$name];
$alias = $this->table->getAlias($table->getComponentName());
if(isset($this->references[$alias])) {
$obj = $this->references[$alias];
$obj->save();
}
}
@ -622,7 +619,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
$table = $fk->getTable();
$name = $table->getComponentName();
$alias = $this->table->getAlias($name);
if($fk instanceof Doctrine_Association) {
switch($fk->getType()):
case Doctrine_Relation::MANY_COMPOSITE:

View File

@ -246,19 +246,15 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
public function create($name) {
return $this->getTable($name)->create();
}
/**
* buildFlushTree
* builds a flush tree that is used in transactions
*
* @return array
*/
public function buildFlushTree() {
$tables = $this->tables;
public function buildFlushTree2(array $tables) {
$tree = array();
foreach($tables as $table) {
if( ! ($table instanceof Doctrine_Table))
$table = $this->getTable($table);
$name = $table->getComponentName();
$index = array_search($name,$tree);
if($index === false)
if($index === false)
$tree[] = $name;
@ -280,15 +276,126 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
$t = $rel->getAssociationFactory();
$n = $t->getComponentName();
$index = array_search($n,$tree);
if($index !== false)
if($index !== false)
unset($tree[$index]);
$tree[] = $n;
}
}
}
return $tree;
return array_values($tree);
}
/**
* buildFlushTree
* builds a flush tree that is used in transactions
*
* @return array
*/
public function buildFlushTree(array $tables) {
$tree = array();
foreach($tables as $k => $table) {
$k = $k.$table;
if( ! ($table instanceof Doctrine_Table))
$table = $this->getTable($table);
$nm = $table->getComponentName();
$index = array_search($nm,$tree);
if($index === false) {
$tree[] = $nm;
$index = max(array_keys($tree));
//print "$k -- adding <b>$nm</b>...<br \>";
}
$rels = $table->getForeignKeys();
// group relations
foreach($rels as $key => $rel) {
if($rel instanceof Doctrine_ForeignKey) {
unset($rels[$key]);
array_unshift($rels, $rel);
}
}
foreach($rels as $rel) {
$name = $rel->getTable()->getComponentName();
$index2 = array_search($name,$tree);
$type = $rel->getType();
// skip self-referenced relations
if($name === $nm)
continue;
if($rel instanceof Doctrine_ForeignKey) {
if($index2 !== false) {
if($index2 >= $index)
continue;
unset($tree[$index]);
array_splice($tree,$index2,0,$nm);
$index = $index2;
//print "$k -- pushing $nm into $index2...<br \>";
} else {
$tree[] = $name;
//print "$k -- adding $nm :$name...<br>";
}
} elseif($rel instanceof Doctrine_LocalKey) {
if($index2 !== false) {
if($index2 <= $index)
continue;
unset($tree[$index2]);
array_splice($tree,$index,0,$name);
//print "$k -- pushing $name into <b>$index</b>...<br \>";
} else {
//array_splice($tree, $index, 0, $name);
array_unshift($tree,$name);
$index++;
//print "$k -- pushing <b>$name</b> into 0...<br \>";
}
} elseif($rel instanceof Doctrine_Association) {
$t = $rel->getAssociationFactory();
$n = $t->getComponentName();
if($index2 !== false)
unset($tree[$index2]);
array_splice($tree,$index, 0,$name);
$index++;
$index3 = array_search($n,$tree);
if($index3 !== false) {
if($index3 >= $index)
continue;
unset($tree[$index]);
array_splice($tree,$index3,0,$n);
$index = $index2;
//print "$k -- pushing $nm into $index3...<br \>";
} else {
$tree[] = $n;
//print "$k -- adding $nm :$name...<br>";
}
}
//print_r($tree);
}
//print_r($tree);
}
return array_values($tree);
}
/**
@ -310,7 +417,7 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
* @return void
*/
private function saveAll() {
$tree = $this->buildFlushTree();
$tree = $this->buildFlushTree($this->tables);
foreach($tree as $name) {
$table = $this->tables[$name];
@ -685,8 +792,14 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
$set[] = $name." = ?";
if($value instanceof Doctrine_Record) {
$array[$name] = $value->getID();
$record->set($name, $value->getID());
switch($value->getState()):
case Doctrine_Record::STATE_TCLEAN:
case Doctrine_Record::STATE_TDIRTY:
$record->save();
default:
$array[$name] = $value->getID();
$record->set($name, $value->getID());
endswitch;
}
endforeach;

View File

@ -401,6 +401,39 @@ class Doctrine_Table extends Doctrine_Configurable {
return $name;
}
/**
* unbinds all relations
*
* @return void
*/
final public function unbindAll() {
$this->bound = array();
$this->relations = array();
$this->boundAliases = array();
}
/**
* unbinds a relation
* returns true on success, false on failure
*
* @param $name
* @return boolean
*/
final public function unbind() {
if( ! isset($this->bound[$name]))
return false;
unset($this->bound[$name]);
if(isset($this->relations[$name]))
unset($this->relations[$name]);
if(isset($this->boundAliases[$name]))
unset($this->boundAliases[$name]);
return true;
}
/**
* binds a relation
*
* @param string $name
* @param string $field
* @return void
@ -518,9 +551,8 @@ class Doctrine_Table extends Doctrine_Configurable {
}
$this->relations[$alias] = $relation;
return $this->relations[$alias];
} else {
throw new InvalidKeyException();
}
throw new InvalidKeyException();
}
/**
* returns an array containing all foreign key objects
@ -530,9 +562,10 @@ class Doctrine_Table extends Doctrine_Configurable {
final public function getForeignKeys() {
$a = array();
foreach($this->bound as $k=>$v) {
$a[$k] = $this->getForeignKey($k);
$this->getForeignKey($k);
}
return $a;
return $this->relations;
}
/**
* sets the database table name

View File

@ -35,7 +35,7 @@ class Doctrine_CollectionTestCase extends Doctrine_UnitTestCase {
$this->assertEqual(count($coll), 3);
$this->assertTrue($coll[2]->getState() == Doctrine_Record::STATE_PROXY);
//$this->assertEqual($coll[2]->getState(), Doctrine_Record::STATE_PROXY);
$generator = new Doctrine_IndexGenerator($this->objTable->getIdentifier());

View File

@ -1,5 +1,44 @@
<?php
class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
public function prepareTables() {
$this->tables[] = "Forum_Category";
$this->tables[] = "Forum_Entry";
$this->tables[] = "Forum_Board";
$this->tables[] = "Forum_Thread";
parent::prepareTables();
}
public function testQueryWithComplexAliases() {
$board = new Forum_Board();
$table = $board->getTable();
$this->assertTrue($table->getForeignKey("Threads") instanceof Doctrine_ForeignKey);
$entry = new Forum_Entry();
$this->assertTrue($entry->getTable()->getForeignKey("Thread") instanceof Doctrine_LocalKey);
$board->name = "Doctrine Forum";
$board->Threads[0];
$board->Category->name = "General discussion";
$this->assertEqual($board->name, "Doctrine Forum");
$this->assertEqual($board->Category->name, "General discussion");
$this->assertEqual($board->Category->getState(), Doctrine_Record::STATE_TDIRTY);
//$this->assertEqual($board->Threads[0]->getState(), Doctrine_Record::STATE_TDIRTY);
$this->assertTrue($board->Threads[0] instanceof Forum_Thread);
//print_r($this->session->buildFlushTree());
$this->session->flush();
/**
$board->getTable()->clear();
$board = $board->getTable()->find($board->getID());
$this->assertEqual($board->Threads->count(), 1);
$this->assertEqual($board->name, "Doctrine Forum");
$this->assertEqual($board->Category->name, "General discussion");
$this->assertEqual($board->Category->getState(), Doctrine_Record::STATE_TDIRTY);
$this->assertEqual($board->Threads[0]->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertTrue($board->Threads[0] instanceof Forum_Thread);
*/
}
public function testQueryWithAliases() {
$task = new Task();

View File

@ -2,6 +2,7 @@
require_once("UnitTestCase.class.php");
class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
public function testJoinTableSelfReferencing() {
$e = new Entity();
$e->name = "Entity test";
@ -118,6 +119,7 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
public function testManyToManyTreeStructure() {
$task = $this->session->create("Task");
$this->assertEqual($task->getTable()->getAlias("Resource"), "ResourceAlias");
@ -135,7 +137,7 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($task->getState(), Doctrine_Record::STATE_TCLEAN);
$this->assertTrue($task->Subtask[0] instanceof Task);
$this->assertEqual($task->Subtask[0]->getState(), Doctrine_Record::STATE_TCLEAN);
//$this->assertEqual($task->Subtask[0]->getState(), Doctrine_Record::STATE_TDIRTY);
$this->assertTrue($task->ResourceAlias[0] instanceof Resource);
$this->assertEqual($task->ResourceAlias[0]->getState(), Doctrine_Record::STATE_TCLEAN);
@ -671,5 +673,6 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$user = $this->session->getTable("User")->find(4);
$this->assertTrue($user->getIterator() instanceof ArrayIterator);
}
}
?>

View File

@ -1,11 +1,98 @@
<?php
require_once("UnitTestCase.class.php");
class Doctrine_SessionTestCase extends Doctrine_UnitTestCase {
public function testBuildFlushTree() {
$tree = $this->session->buildFlushTree();
//print_r($tree);
public function testBuildFlushTree() {
$correct = array("Task","Resource","Assignment");
$task = new Task();
$tree = $this->session->buildFlushTree(array("Task"));
$this->assertEqual($tree,array("Resource","Task","Assignment"));
$tree = $this->session->buildFlushTree(array("Task","Resource"));
$this->assertEqual($tree,$correct);
$tree = $this->session->buildFlushTree(array("Task","Assignment","Resource"));
$this->assertEqual($tree,$correct);
$tree = $this->session->buildFlushTree(array("Assignment","Task","Resource"));
$this->assertEqual($tree,$correct);
$correct = array("Forum_Category","Forum_Board","Forum_Thread");
$tree = $this->session->buildFlushTree(array("Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Category","Forum_Board"));
$this->assertEqual($tree, $correct);
$correct = array("Forum_Category","Forum_Board","Forum_Thread","Forum_Entry");
$tree = $this->session->buildFlushTree(array("Forum_Entry","Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Entry"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Thread","Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Thread"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Thread","Forum_Entry"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Entry","Forum_Thread"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Entry","Forum_Board","Forum_Thread"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Entry","Forum_Thread","Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Thread","Forum_Board","Forum_Entry"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Thread","Forum_Entry","Forum_Board"));
$this->assertEqual($tree, $correct);
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Thread","Forum_Category"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Category","Forum_Thread","Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Thread","Forum_Board","Forum_Category"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Thread","Forum_Category","Forum_Entry"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Thread","Forum_Entry","Forum_Category"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Board","Forum_Category","Forum_Thread","Forum_Entry"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Entry","Forum_Thread","Forum_Board","Forum_Category"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Entry","Forum_Thread","Forum_Category","Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Entry","Forum_Category","Forum_Board","Forum_Thread"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Thread","Forum_Category","Forum_Board","Forum_Entry"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Thread","Forum_Entry","Forum_Category","Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Thread","Forum_Board","Forum_Entry","Forum_Category"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Category","Forum_Entry","Forum_Board","Forum_Thread"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Category","Forum_Thread","Forum_Entry","Forum_Board"));
$this->assertEqual($tree, $correct);
$tree = $this->session->buildFlushTree(array("Forum_Category","Forum_Board","Forum_Thread","Forum_Entry"));
$this->assertEqual($tree, $correct);
}
public function testBulkInsert() {
$u1 = new User();
$u1->name = "Jean Reno";
@ -266,6 +353,5 @@ class Doctrine_SessionTestCase extends Doctrine_UnitTestCase {
$this->session->clear();
$this->assertEqual($this->session->getTables(), array());
}
}
?>

View File

@ -1,6 +1,9 @@
<?php
require_once("UnitTestCase.class.php");
class Doctrine_TableTestCase extends Doctrine_UnitTestCase {
public function testBind() {
$table = $this->session->getTable("User");
}
public function testGetIdentifier() {
$table = $this->session->getTable("User");

View File

@ -20,7 +20,7 @@ class Doctrine_UnitTestCase extends UnitTestCase {
protected $listener;
protected $cache;
protected $users;
protected $tables;
protected $tables = array();
private $init = false;
@ -31,7 +31,8 @@ class Doctrine_UnitTestCase extends UnitTestCase {
$this->manager->setAttribute(Doctrine::ATTR_CACHE, Doctrine::CACHE_NONE);
$this->manager->setAttribute(Doctrine::ATTR_FETCHMODE, Doctrine::FETCH_IMMEDIATE);
$this->tables = array("entity","entityReference","email","phonenumber","groupuser","album","song","element","error","description","address","account","task","resource","assignment");
$this->tables = array_merge($this->tables, array("entity","entityReference","email","phonenumber","groupuser","album","song","element","error","description","address","account","task","resource","assignment"));
@ -52,8 +53,10 @@ class Doctrine_UnitTestCase extends UnitTestCase {
$this->prepareData();
}
public function prepareTables() {
foreach($this->tables as $name) {
$this->dbh->query("DROP TABLE IF EXISTS $name");
$this->dbh->query("DROP TABLE IF EXISTS ".strtolower($name));
}
foreach($this->tables as $name) {

View File

@ -160,4 +160,56 @@ class Assignment extends Doctrine_Record {
$this->hasColumn("resource_id","integer");
}
}
class Forum_Category extends Doctrine_Record {
public function setTableDefinition() {
$this->hasColumn("root_category_id", "integer", 10);
$this->hasColumn("parent_category_id", "integer", 10);
$this->hasColumn("name", "string", 50);
$this->hasColumn("description", "string", 99999);
}
public function setUp() {
$this->hasMany("Forum_Category as Subcategory", "Subcategory.parent_category_id");
$this->hasOne("Forum_Category as Rootcategory", "Forum_Category.root_category_id");
}
}
class Forum_Board extends Doctrine_Record {
public function setTableDefinition() {
$this->hasColumn("category_id", "integer", 10);
$this->hasColumn("name", "string", 100);
$this->hasColumn("description", "string", 5000);
}
public function setUp() {
$this->hasOne("Forum_Category as Category", "Forum_Board.category_id");
$this->ownsMany("Forum_Thread as Threads", "Forum_Thread.board_id");
}
}
class Forum_Entry extends Doctrine_Record {
public function setTableDefinition() {
$this->hasColumn("author", "string", 50);
$this->hasColumn("topic", "string", 100);
$this->hasColumn("message", "string", 99999);
$this->hasColumn("parent_entry_id", "integer", 10);
$this->hasColumn("thread_id", "integer", 10);
$this->hasColumn("date", "integer", 10);
}
public function setUp() {
$this->hasOne("Forum_Entry as Parent", "Forum_Entry.parent_entry_id");
$this->hasOne("Forum_Thread as Thread", "Forum_Entry.thread_id");
}
}
class Forum_Thread extends Doctrine_Record {
public function setTableDefinition() {
$this->hasColumn("board_id", "integer", 10);
$this->hasColumn("updated", "integer", 10);
$this->hasColumn("closed", "integer", 1);
}
public function setUp() {
$this->hasOne("Forum_Board as Board", "Forum_Thread.board_id");
$this->ownsMany("Forum_Entry as Entry", "Forum_Entry.thread_id");
}
}
?>

View File

@ -24,17 +24,12 @@ error_reporting(E_ALL);
$test = new GroupTest("Doctrine Framework Unit Tests");
$test->addTestCase(new Doctrine_SessionTestCase());
$test->addTestCase(new Doctrine_TableTestCase());
$test->addTestCase(new Doctrine_SessionTestCase());
$test->addTestCase(new Doctrine_RecordTestCase());
$test->addTestCase(new Doctrine_ValidatorTestCase());
$test->addTestCase(new Doctrine_ManagerTestCase());
@ -54,6 +49,8 @@ $test->addTestCase(new Doctrine_Collection_OffsetTestCase());
$test->addTestCase(new Sensei_UnitTestCase());
$test->addTestCase(new Doctrine_QueryTestCase());
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());