/** * Method adds related "parent/ancestor" records recursively. * * It should be used only to create records which have only one primary key. * * Note: in theory it should work for ancestor records with multiple primary keys * but this behaviour is undefined. * * @param string $table Table name * @param string $primaryKey Used as primary key for ancestor * @return int New ID * @access package private */ function addAncestor($table, $primaryKey = null) { $doAncestor = OA_Dal::factoryDO($table); if ($primaryKey && ($primaryKeyField = $doAncestor->getFirstPrimaryKey())) { // it's possible to preset parent id's (only one level up so far) $doAncestor->{$primaryKeyField} = $primaryKey; } if (!empty($this) && is_a($this, 'DataGenerator')) { $this->setDefaultValues($doAncestor); } else { DataGenerator::setDefaultValues($doAncestor); } $links = $doAncestor->links(); foreach ($links as $foreignKey => $linkedTableField) { list($ancestorTableWithPrefix, $link) = explode(':', $linkedTableField); $ancestorTable = $doAncestor->getTableWithoutPrefix($ancestorTableWithPrefix); if (isset($this) && is_a($this, 'DataGenerator')) { $fieldValue = $this->getFieldValueFromDataContainer($table, $foreignKey); } else { $fieldValue = DataGenerator::getFieldValueFromDataContainer($table, $foreignKey); } if (isset($fieldValue) && !isset($GLOBALS['dataGeneratorDontOptimize'])) { //hack for quick test fix $doAncestor->{$foreignKey} = $fieldValue; } else { if (isset($this) && is_a($this, 'DataGenerator')) { $doAncestor->{$foreignKey} = $this->addAncestor($ancestorTable); } else { $doAncestor->{$foreignKey} = DataGenerator::addAncestor($ancestorTable); } } } DataGenerator::trackData($table); $id = $doAncestor->insert(); DataGenerator::getReferenceId($table, $id); // store the id return $id; }