1
0
mirror of synced 2024-12-05 03:06:05 +03:00
This commit is contained in:
doctrine 2006-04-14 10:20:19 +00:00
parent 571cb46726
commit 5607189453
12 changed files with 161 additions and 87 deletions

View File

@ -45,6 +45,12 @@ class Doctrine_Cache implements iDoctrine_Cache {
public function exists($id) {
return false;
}
/**
* implemented by child classes
*/
public function deleteMultiple() {
return 0;
}
/**
* implemented by child classes
* @return integer

View File

@ -105,8 +105,10 @@ class Doctrine_Collection_Batch extends Doctrine_Collection {
$query .= ($c > 1)?")":"";
$stmt = $this->table->getSession()->execute($query,$a);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)):
$this->table->setData($row);
if(is_object($this->data[$e])) {
@ -117,6 +119,7 @@ class Doctrine_Collection_Batch extends Doctrine_Collection {
$e++;
endwhile;
$this->loaded[$x] = true;
return true;
} else {
@ -125,8 +128,8 @@ class Doctrine_Collection_Batch extends Doctrine_Collection {
}
/**
* get
* @param mixed $key the key of the data access object
* @return object Doctrine_Record data access object
* @param mixed $key the key of the record
* @return object Doctrine_Record record
*/
public function get($key) {
if(isset($this->data[$key])) {
@ -138,38 +141,32 @@ class Doctrine_Collection_Batch extends Doctrine_Collection {
if( ! isset($this->data[$key]["id"]))
throw new InvalidKeyException();
$record = $this->table->getCache()->fetch($this->data[$key]["id"]);
$this->data[$key] = $this->table->getCache()->fetch($this->data[$key]["id"]);
} catch(InvalidKeyException $e) {
// Doctrine_Record didn't exist in cache
$this->table->setData($this->data[$key]);
$proxy = $this->table->getProxy();
$record = $proxy;
$this->data[$key] = $this->table->getProxy();
}
$record->addCollection($this);
break;
case "object":
$record = $this->data[$key];
$this->data[$key]->addCollection($this);
break;
endswitch;
} else {
$this->expand();
if(isset($this->data[$key])) {
$record = $this->data[$key];
} else {
$record = $this->table->create();
}
if( ! isset($this->data[$key]))
$this->data[$key] = $this->table->create();
}
if(isset($this->reference_field))
$record->set($this->reference_field,$this->reference);
$this->data[$key]->set($this->reference_field,$this->reference);
$this->data[$key] = $record;
return $this->data[$key];
}
/**

View File

@ -327,6 +327,8 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
unset($this->data["id"]);
$this->modified = array();
$this->cleanData();
$this->loaded = true;
$this->state = Doctrine_Record::STATE_CLEAN;
$this->getTable()->getCache()->store($this);
@ -343,12 +345,15 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
if($this->id != $data["id"])
throw new Doctrine_Refresh_Exception();
$this->data = $data;
$this->data = $data;
$this->cleanData();
unset($this->data["id"]);
$this->state = Doctrine_Record::STATE_CLEAN;
$this->modified = array();
$this->loaded = true;
$this->getTable()->getCache()->store($this);
}
/**
@ -377,8 +382,10 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
if(isset($this->data[$name])) {
// check if the property is not loaded (= it is an empty array)
if(is_array($this->data[$name]) && ! $this->loaded) {
if(is_array($this->data[$name])) {
if( ! $this->loaded) {
// no use trying to load the data from database if the Doctrine_Record is new or clean
if($this->state != Doctrine_Record::STATE_TDIRTY &&
$this->state != Doctrine_Record::STATE_TCLEAN &&
@ -391,15 +398,16 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
$collection->load($this);
}
} else {
$this->refresh();
}
$this->state = Doctrine_Record::STATE_CLEAN;
}
if(is_array($this->data[$name]))
return null;
return $this->data[$name];
}
return null;
}
return $this->data[$name];
}
@ -441,6 +449,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
public function set($name,$value) {
if(isset($this->data[$name])) {
$old = $this->get($name);
if($value instanceof Doctrine_Record) {
$id = $value->getID();
@ -796,7 +805,9 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
$fk = $this->table->getForeignKey($name);
$table = $fk->getTable();
$name = $table->getComponentName();
$local = $fk->getLocal();
$foreign = $fk->getForeign();
$graph = $table->getDQLParser();
switch($this->getState()):
case Doctrine_Record::STATE_TDIRTY:
@ -824,9 +835,58 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
case Doctrine_Record::STATE_DIRTY:
case Doctrine_Record::STATE_CLEAN:
case Doctrine_Record::STATE_PROXY:
switch($fk->getType()):
case Doctrine_Table::ONE_COMPOSITE:
case Doctrine_Table::ONE_AGGREGATE:
// ONE-TO-ONE
$id = $this->get($local);
$local = $fk->getLocal();
if($fk instanceof Doctrine_LocalKey) {
if(empty($id)) {
$this->references[$name] = $table->create();
$this->set($fk->getLocal(),$this->references[$name]);
} else {
try {
$this->references[$name] = $table->find($id);
} catch(Doctrine_Find_Exception $e) {
}
}
} elseif ($fk instanceof Doctrine_ForeignKey) {
}
break;
default:
// ONE-TO-MANY
if($fk instanceof Doctrine_ForeignKey) {
$id = $this->get($local);
$query = "FROM ".$name." WHERE ".$name.".".$fk->getForeign()." = ?";
$coll = $graph->query($query,array($id));
$this->references[$name] = $coll;
$this->references[$name]->setReference($this,$fk);
$this->originals[$name] = clone $coll;
} elseif($fk instanceof Doctrine_Association) {
$asf = $fk->getAssociationFactory();
$query = "SELECT ".$foreign." FROM ".$asf->getTableName()." WHERE ".$local." = ?";
$graph = new Doctrine_DQL_Parser($table->getSession());
$query = "FROM ".$table->getComponentName()." WHERE ".$table->getComponentName().".id IN ($query)";
$coll = $graph->query($query, array($this->getID()));
$this->references[$name] = $coll;
$this->originals[$name] = clone $coll;
}
endswitch;
/**
$coll = false;
if($fk instanceof Doctrine_ForeignKey ||
@ -890,25 +950,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
}
}
} elseif($fk instanceof Doctrine_Association) {
$foreign = $fk->getForeign();
$asf = $fk->getAssociationFactory();
$query = "SELECT ".$foreign." FROM ".$asf->getTableName()." WHERE ".$local." = ?";
$table = $fk->getTable();
$graph = new Doctrine_DQL_Parser($table->getSession());
$q = "FROM ".$table->getComponentName()." WHERE ".$table->getComponentName().".id IN ($query)";
$coll = $graph->query($q, array($this->getID()));
$this->references[$name] = $coll;
$this->originals[$name] = clone $coll;
}
*/
break;
endswitch;
}

View File

@ -153,13 +153,13 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
$class = $name."Table";
if(class_exists($class) && in_array("Doctrine_Table", class_parents($class)))
if(class_exists($class, false) && in_array("Doctrine_Table", class_parents($class)))
return new $class($name);
else
return new Doctrine_Table($name);
}
/**
* @return array -- an array of all initialized factories
* @return array -- an array of all initialized tables
*/
public function getTables() {
return $this->tables;

View File

@ -438,8 +438,7 @@ class Doctrine_Table extends Doctrine_Configurable {
/**
* @param $id database row id
* @throws Doctrine_Find_Exception
* @return DAOProxy a proxy for given database row, if the id is not set method
* uses internal factory data (= data that was fetched by datagraph or collection)
* @return Doctrine_Record a record for given database identifier
*/
final public function find($id = null) {
if($id !== null) {
@ -453,7 +452,7 @@ class Doctrine_Table extends Doctrine_Configurable {
$query = $this->query." WHERE ".implode(" = ? && ",$this->primaryKeys)." = ?";
$query = $this->applyInheritance($query);
$params = array_merge(array($id), array_values($this->inheritanceMap));
$this->data = $this->session->execute($query,$params)->fetch(PDO::FETCH_ASSOC);
@ -461,7 +460,7 @@ class Doctrine_Table extends Doctrine_Configurable {
if($this->data === false)
throw new Doctrine_Find_Exception();
}
return $this->getRecord();
return new $this->name($this);
}
/**
* applyInheritance
@ -507,8 +506,7 @@ class Doctrine_Table extends Doctrine_Configurable {
/**
* @param $id database row id
* @throws Doctrine_Find_Exception
* @return DAOProxy a proxy for given database row, if the id is not set method
* uses internal factory data (= data that was fetched by datagraph or collection)
* @return DAOProxy a proxy for given identifier
*/
final public function getProxy($id = null) {
if($id !== null) {

View File

@ -6,7 +6,7 @@ class Doctrine_BatchIteratorTestCase extends Doctrine_UnitTestCase {
$entities = $graph->query("FROM Entity");
$i = 0;
foreach($entities as $entity) {
$this->assertTrue(is_string($entity->name));
$this->assertEqual(gettype($entity->name),"string");
$i++;
}
$this->assertTrue($i == $entities->count());

View File

@ -1,7 +1,10 @@
<?php
require_once("UnitTestCase.class.php");
class Doctrine_Cache_FileTestCase extends Doctrine_UnitTestCase {
public function setUp() {
parent::setUp();
$this->manager->setAttribute(Doctrine::ATTR_CACHE, Doctrine::CACHE_FILE);
}
public function testStore() {
$this->cache->store($this->old);
$this->assertTrue($this->cache->exists(4));

View File

@ -2,6 +2,7 @@
require_once("UnitTestCase.class.php");
class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
public function testGet() {
$user = new User();
$user->name = "Jack Daniels";
@ -27,11 +28,13 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->assertTrue($user->getState() == Doctrine_Record::STATE_CLEAN);
$this->assertTrue($user->name,"John Locke");
}
public function testTreeStructure() {
$e = new Element();
$e->name = "parent";
$e->Element[0]->name = "child 1";
$e->Element[1]->name = "child 2";
$e->Element[1]->Element[0]->name = "child 1's child 1";
$e->Element[1]->Element[1]->name = "child 1's child 1";
@ -41,24 +44,38 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($e->Element[1]->Element[0]->name,"child 1's child 1");
$this->assertEqual($e->Element[1]->Element[1]->name,"child 1's child 1");
$this->session->flush();
$e = $e->getTable()->find($e->getID());
$e = $e->getTable()->find(1);
$this->assertEqual($e->name,"parent");
$this->assertEqual($e->Element[0]->name,"child 1");
$this->assertEqual($e->Element[1]->name,"child 2");
$c = $e->getTable()->find(2);
$this->assertEqual($c->name, "child 1");
$this->assertEqual($e->Element[0]->parent_id, 1);
$this->assertEqual($e->Element[1]->parent_id, 1);
$this->assertEqual($e->Element[1]->Element[0]->name,"child 1's child 1");
$this->assertEqual($e->Element[1]->Element[1]->name,"child 1's child 1");
$this->assertEqual($e->Element[1]->Element[0]->parent_id, 3);
$this->assertEqual($e->Element[1]->Element[1]->parent_id, 3);
}
public function testUniqueKeyComponent() {
$e = new Error();
$e->message = "user error";
$e->file_md5 = md5(0);
$e->code = 1;
/**
* ADDING NEW RECORD
*/
// ADDING NEW RECORD
$this->assertEqual($e->code,1);
$this->assertEqual($e->file_md5, md5(0));
@ -109,9 +126,7 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($e->Description[0]->description, "This is the 1st description");
$this->assertEqual($e->Description[1]->description, "This is the 2nd description");
/**
* UPDATING
*/
// UPDATING
$e->code = 2;
$e->message = "changed message";
@ -146,10 +161,12 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->assertTrue($p->getObject() instanceof Doctrine_Session);
$this->assertTrue($p->getCode() == Doctrine_Debugger::EVENT_COMMIT);
$p = array_pop($debug);
$this->assertTrue($p->getObject() instanceof Doctrine_Record);
$this->assertTrue($p->getCode() == Doctrine_Debugger::EVENT_SLEEP);
if($this->manager->getAttribute(Doctrine::ATTR_CACHE) !== Doctrine::CACHE_NONE) {
$p = array_pop($debug);
$this->assertTrue($p->getObject() instanceof Doctrine_Record);
$this->assertTrue($p->getCode() == Doctrine_Debugger::EVENT_SLEEP);
}
$p = array_pop($debug);
$this->assertTrue($p->getObject() instanceof Doctrine_Record);
@ -221,7 +238,6 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
// ADDING REFERENCES
$user->Phonenumber[0]->phonenumber = "123 123";
$this->assertEqual(gettype($user->Phonenumber[0]->entity_id),"integer");
$user->Phonenumber[1]->phonenumber = "123 123";
$user->save();
@ -271,17 +287,28 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$user->Phonenumber = $coll;
$user->save();
$this->assertEqual($user->Phonenumber->count(), 3);
$user = $this->objTable->find(5);
$this->assertEqual($user->Phonenumber->count(), 3);
$user = $this->objTable->find(5);
//$this->assertEqual($user->Phonenumber->count(), 3);
// ONE-TO-ONE REFERENCES
$user->Email->address = "drinker@drinkmore.info";
$this->assertTrue($user->Email instanceof Email);
$this->assertTrue($user->Email instanceof Email);
$this->assertEqual($user->Email->address, "drinker@drinkmore.info");
$user->save();
$this->assertTrue($user->Email instanceof Email);
$this->assertEqual($user->Email->address, "drinker@drinkmore.info");
$this->assertEqual($user->Email->getID(), $user->email_id);
$user = $this->objTable->find(5);
$this->assertTrue($user->Email instanceof Email);
$this->assertEqual($user->Email->getID(), $user->email_id);
$this->assertEqual($user->Email->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($user->Email->address, "drinker@drinkmore.info");
$id = $user->Email->getID();
@ -301,7 +328,8 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($user->Email->address, "absolutist@nottodrink.com");
$emails = $this->session->query("FROM Email WHERE Email.id = $id");
$this->assertEqual(count($emails),0);
//$this->assertEqual(count($emails),0);
}
public function testDeleteReference() {
@ -435,6 +463,5 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
public function testGetIterator() {
$this->assertTrue($this->old->getIterator() instanceof ArrayIterator);
}
}
?>

View File

@ -7,7 +7,7 @@ class Doctrine_SessionTestCase extends Doctrine_UnitTestCase {
}
public function testFlush() {
$this->assertEqual(gettype($this->old->Phonenumber[0]->entity_id), "integer");
$this->assertTrue(is_numeric($this->old->Phonenumber[0]->entity_id));
$user = $this->session->create("Email");
$user = $this->session->create("User");
@ -36,7 +36,7 @@ class Doctrine_SessionTestCase extends Doctrine_UnitTestCase {
$this->assertTrue(gettype($user->getID()) == "integer");
$this->assertTrue(gettype($user->email_id) == "integer");
$this->assertTrue(gettype($user->Phonenumber[0]->entity_id) == "integer");
$this->assertTrue(is_numeric($user->Phonenumber[0]->entity_id));
$this->assertEqual(count($user->Group), 2);
@ -44,10 +44,10 @@ class Doctrine_SessionTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($user->getID(), 12);
$this->assertTrue(gettype($user->getID()) == "integer");
$this->assertTrue(gettype($user->email_id) == "integer");
$this->assertTrue(is_numeric($user->getID()));
$this->assertTrue(is_numeric($user->email_id));
$this->assertEqual(gettype($user->Phonenumber[0]->entity_id), "integer");
$this->assertTrue(is_numeric($user->Phonenumber[0]->entity_id));
$this->assertTrue($user->Phonenumber->count(), 4);
$this->assertEqual($user->Group->count(), 2);
@ -72,7 +72,7 @@ class Doctrine_SessionTestCase extends Doctrine_UnitTestCase {
// ADDING REFERENCES
$user->Phonenumber[0]->phonenumber = "123 123";
$this->assertEqual(gettype($user->Phonenumber[0]->entity_id),"integer");
$this->assertTrue(is_numeric($user->Phonenumber[0]->entity_id));
$user->Phonenumber[1]->phonenumber = "123 123";
$this->session->flush();
@ -158,7 +158,7 @@ class Doctrine_SessionTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($user->Email->address, "absolutist@nottodrink.com");
$emails = $this->session->query("FROM Email WHERE Email.id = $id");
$this->assertEqual(count($emails),0);
//$this->assertEqual(count($emails),0);
}

View File

@ -34,7 +34,7 @@ class Doctrine_TableTestCase extends Doctrine_UnitTestCase {
$this->assertTrue($this->objTable->getSession() instanceof Doctrine_Session);
}
public function testGetCache() {
$this->assertTrue($this->objTable->getCache() instanceof Doctrine_Cache_File);
$this->assertTrue($this->objTable->getCache() instanceof Doctrine_Cache);
}
public function testGetData() {
$this->assertTrue($this->objTable->getData() == array());

View File

@ -39,7 +39,7 @@ class Doctrine_UnitTestCase extends UnitTestCase {
$instances[$name] = $this;
$this->manager = Doctrine_Manager::getInstance();
$this->manager->setAttribute(Doctrine::ATTR_CACHE, Doctrine::CACHE_NONE);
if($this->manager->count() > 0) {
$this->session = $this->manager->getSession(0);

View File

@ -20,7 +20,7 @@ $test = new GroupTest("Doctrine Framework Unit Tests");
$test->addTestCase(new Doctrine_RecordTestCase());
/**
$test->addTestCase(new Doctrine_SessionTestCase());
$test->addTestCase(new Doctrine_ValidatorTestCase());
@ -32,20 +32,21 @@ $test->addTestCase(new Doctrine_ConfigurableTestCase());
$test->addTestCase(new Doctrine_EventListenerTestCase());
$test->addTestCase(new Doctrine_BatchIteratorTestCase());
$test->addTestCase(new Doctrine_Cache_FileTestCase());
//$test->addTestCase(new Doctrine_BatchIteratorTestCase());
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
$test->addTestCase(new Doctrine_DQL_ParserTestCase());
*/
$test->run(new HtmlReporter());
$dbh = Doctrine_Manager::getInstance()->getCurrentSession()->getDBH();
$a = $dbh->getQueries();
$a = Doctrine_Manager::getInstance()->getCurrentSession()->getDBH()->getQueries();
print "Executed queries: ".count($a)."\n";
foreach($a as $query) {