Algorithm for creating the tables in correct order
This commit is contained in:
parent
b1a3eed4e9
commit
47daaa9cfa
5 changed files with 79 additions and 21 deletions
|
@ -42,6 +42,10 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
|
|||
* keys representing Doctrine_Table component names and values as Doctrine_Table objects
|
||||
*/
|
||||
protected $tables = array();
|
||||
/**
|
||||
* @var array $exported
|
||||
*/
|
||||
protected $exported = array();
|
||||
/**
|
||||
* @var string $driverName the name of this connection driver
|
||||
*/
|
||||
|
@ -751,15 +755,59 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
|
|||
$class = $name . 'Table';
|
||||
|
||||
if (class_exists($class) && in_array('Doctrine_Table', class_parents($class))) {
|
||||
$table = new $class($name, $this, $allowExport);
|
||||
$table = new $class($name, $this);
|
||||
} else {
|
||||
$table = new Doctrine_Table($name, $this, $allowExport);
|
||||
$table = new Doctrine_Table($name, $this);
|
||||
}
|
||||
|
||||
|
||||
$this->tables[$name] = $table;
|
||||
|
||||
if ($table->getAttribute(Doctrine::ATTR_EXPORT) & Doctrine::EXPORT_TABLES) {
|
||||
$table->export();
|
||||
|
||||
if ($allowExport) {
|
||||
|
||||
// the following is an algorithm for loading all
|
||||
// the related tables for all loaded tables
|
||||
|
||||
$next = count($this->tables);
|
||||
$prev = count($this->exported);
|
||||
$stack = $this->exported;
|
||||
while ($prev < $next) {
|
||||
$prev = count($this->tables);
|
||||
|
||||
foreach($this->tables as $name => $tableObject) {
|
||||
if (isset($stack[$name])) {
|
||||
continue;
|
||||
} else {
|
||||
$stack[$name] = true;
|
||||
}
|
||||
|
||||
$tableObject->getRelations();
|
||||
|
||||
//$this->getTable('RelationTestChild')->getRelation('Children');
|
||||
}
|
||||
$next = count($this->tables);
|
||||
}
|
||||
|
||||
|
||||
// when all the tables are loaded we build the array in which the order of the tables is
|
||||
// relationally correct so that then those can be created in the given order)
|
||||
|
||||
$names = array_keys($this->tables);
|
||||
|
||||
$names = $this->unitOfWork->buildFlushTree($names);
|
||||
|
||||
foreach($names as $name) {
|
||||
$tableObject = $this->tables[$name];
|
||||
|
||||
if (isset($this->exported[$name])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($tableObject->getAttribute(Doctrine::ATTR_EXPORT) & Doctrine::EXPORT_TABLES) {
|
||||
|
||||
$tableObject->export();
|
||||
}
|
||||
$this->exported[$name] = true;
|
||||
}
|
||||
}
|
||||
|
||||
return $table;
|
||||
|
@ -863,6 +911,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
|
|||
public function evictTables()
|
||||
{
|
||||
$this->tables = array();
|
||||
$this->exported = array();
|
||||
}
|
||||
/**
|
||||
* close
|
||||
|
|
|
@ -49,7 +49,7 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module implemen
|
|||
foreach ($tables as $k => $table) {
|
||||
|
||||
if ( ! ($table instanceof Doctrine_Table)) {
|
||||
$table = $this->conn->getTable($table);
|
||||
$table = $this->conn->getTable($table, false);
|
||||
}
|
||||
$nm = $table->getComponentName();
|
||||
|
||||
|
|
|
@ -190,7 +190,7 @@ class Doctrine_Export_Sqlite extends Doctrine_Export
|
|||
foreach ($fk as $definition) {
|
||||
|
||||
$query = 'CREATE TRIGGER doctrine_' . $name . '_cscd_delete '
|
||||
. 'AFTER DELETE ON ' . $name . ' FOR EACH STATEMENT '
|
||||
. 'AFTER DELETE ON ' . $name . ' FOR EACH ROW '
|
||||
. 'BEGIN '
|
||||
. 'DELETE FROM ' . $definition['foreignTable'] . ' WHERE ';
|
||||
|
||||
|
|
|
@ -148,7 +148,9 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||
} else {
|
||||
$class = get_class($this);
|
||||
// get the table of this class
|
||||
$this->_table = Doctrine_Manager::getInstance()->getConnectionForComponent($class)->getTable(get_class($this));
|
||||
$this->_table = Doctrine_Manager::getInstance()
|
||||
->getTable(get_class($this));
|
||||
|
||||
$exists = false;
|
||||
}
|
||||
|
||||
|
@ -322,12 +324,12 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||
*/
|
||||
public function errorStack($stack = null)
|
||||
{
|
||||
if($stack !== null) {
|
||||
if( ! ($stack instanceof Doctrine_Validator_ErrorStack)) {
|
||||
throw new Doctrine_Record_Exception('Argument should be an instance of Doctrine_Validator_ErrorStack.');
|
||||
}
|
||||
if($stack !== null) {
|
||||
if( ! ($stack instanceof Doctrine_Validator_ErrorStack)) {
|
||||
throw new Doctrine_Record_Exception('Argument should be an instance of Doctrine_Validator_ErrorStack.');
|
||||
}
|
||||
$this->_errorStack = $stack;
|
||||
} else {
|
||||
} else {
|
||||
return $this->_errorStack;
|
||||
}
|
||||
}
|
||||
|
@ -1548,7 +1550,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||
*/
|
||||
public function index($name, array $definition = array())
|
||||
{
|
||||
if ( ! $definition) {
|
||||
if ( ! $definition) {
|
||||
return $this->_table->getIndex($name);
|
||||
} else {
|
||||
return $this->_table->addIndex($name, $definition);
|
||||
|
|
|
@ -172,7 +172,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
* @throws Doctrine_Table_Exception if there is already an instance of this table
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($name, Doctrine_Connection $conn, $allowExport)
|
||||
public function __construct($name, Doctrine_Connection $conn)
|
||||
{
|
||||
$this->conn = $conn;
|
||||
|
||||
|
@ -684,7 +684,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
public function getBound($name)
|
||||
{
|
||||
if ( ! isset($this->bound[$name])) {
|
||||
throw new Doctrine_Table_Exception('Unknown bound '.$name);
|
||||
throw new Doctrine_Table_Exception('Unknown bound ' . $name);
|
||||
}
|
||||
return $this->bound[$name];
|
||||
}
|
||||
|
@ -737,7 +737,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
* @return void
|
||||
*/
|
||||
public function unbindAll()
|
||||
{
|
||||
{ throw new Exception();
|
||||
$this->bound = array();
|
||||
$this->relations = array();
|
||||
$this->boundAliases = array();
|
||||
|
@ -850,6 +850,13 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
if (isset($this->relations[$name])) {
|
||||
return $this->relations[$name];
|
||||
}
|
||||
|
||||
if ( ! $this->conn->hasTable($this->options['name'])) {
|
||||
$allowExport = true;
|
||||
} else {
|
||||
$allowExport = false;
|
||||
}
|
||||
|
||||
if (isset($this->bound[$name])) {
|
||||
|
||||
$definition = $this->bound[$name];
|
||||
|
@ -857,7 +864,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
list($component, $definition['foreign']) = explode('.', $definition['field']);
|
||||
unset($definition['field']);
|
||||
|
||||
$definition['table'] = $this->conn->getTable($definition['class'], false);
|
||||
$definition['table'] = $this->conn->getTable($definition['class'], $allowExport);
|
||||
$definition['constraint'] = false;
|
||||
|
||||
if ($component == $this->options['name'] || in_array($component, $this->options['parents'])) {
|
||||
|
@ -930,7 +937,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
if ($e2[0] != $component) {
|
||||
throw new Doctrine_Table_Exception($e2[0] . ' doesn\'t match ' . $component);
|
||||
}
|
||||
$associationTable = $this->conn->getTable($e2[0]);
|
||||
$associationTable = $this->conn->getTable($e2[0], $allowExport);
|
||||
|
||||
if (count($fields) > 1) {
|
||||
// SELF-REFERENCING THROUGH JOIN TABLE
|
||||
|
@ -984,6 +991,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
|
||||
return $this->relations[$name];
|
||||
}
|
||||
|
||||
|
||||
// load all relations
|
||||
$this->getRelations();
|
||||
|
@ -1002,7 +1010,6 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||
*/
|
||||
final public function getRelations()
|
||||
{
|
||||
$a = array();
|
||||
foreach ($this->bound as $k => $v) {
|
||||
$this->getRelation($k);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue