loadRelationships(); } /** * @static * @return SugarRelationshipFactory */ public static function getInstance() { if (is_null(self::$rfInstance)) self::$rfInstance = new SugarRelationshipFactory(); return self::$rfInstance; } public static function rebuildCache() { self::getInstance()->buildRelationshipCache(); } public static function deleteCache() { $file = self::getInstance()->getCacheFile(); if(sugar_is_file($file)) { unlink($file); } } /** * @param $relationshipName String name of relationship to load * @return void * * * */ public function getRelationship($relationshipName) { if (empty($this->relationships[$relationshipName])) { $GLOBALS['log']->error("Unable to find relationship $relationshipName"); return false; } $def = $this->relationships[$relationshipName]; $type = isset($def['true_relationship_type']) ? $def['true_relationship_type'] : $def['relationship_type']; switch($type) { case "many-to-many": if (isset($def['rhs_module']) && $def['rhs_module'] == 'EmailAddresses') { require_once("data/Relationships/EmailAddressRelationship.php"); return new EmailAddressRelationship($def); } require_once("data/Relationships/M2MRelationship.php"); return new M2MRelationship($def); break; case "one-to-many": require_once("data/Relationships/One2MBeanRelationship.php"); //If a relationship has no table or join keys, it must be bean based if (empty($def['true_relationship_type']) || (empty($def['table']) && empty($def['join_table'])) || empty($def['join_key_rhs'])){ return new One2MBeanRelationship($def); } else { return new One2MRelationship($def); } break; case "one-to-one": if (empty($def['true_relationship_type'])){ require_once("data/Relationships/One2OneBeanRelationship.php"); return new One2OneBeanRelationship($def); } else { require_once("data/Relationships/One2OneRelationship.php"); return new One2OneRelationship($def); } break; } $GLOBALS['log']->fatal ("$relationshipName had an unknown type $type "); return false; } public function getRelationshipDef($relationshipName) { if (empty($this->relationships[$relationshipName])) { $GLOBALS['log']->error("Unable to find relationship $relationshipName"); return false; } return $this->relationships[$relationshipName]; } protected function loadRelationships() { if(sugar_is_file($this->getCacheFile())) { include($this->getCacheFile()); $this->relationships = $relationships; } else { $this->buildRelationshipCache(); } } protected function buildRelationshipCache() { global $beanList, $dictionary, $buildingRelCache; if ($buildingRelCache) return; $buildingRelCache = true; include_once("modules/TableDictionary.php"); if (empty($beanList)) include("include/modules.php"); //Reload ALL the module vardefs.... foreach($beanList as $moduleName => $beanName) { VardefManager::loadVardef($moduleName, BeanFactory::getObjectName($moduleName)); } $relationships = array(); //Grab all the relationships from the dictionary. foreach ($dictionary as $key => $def) { if (!empty($def['relationships'])) { foreach($def['relationships'] as $relKey => $relDef) { if ($key == $relKey) //Relationship only entry, we need to capture everything $relationships[$key] = array_merge(array('name' => $key), $def, $relDef); else { $relationships[$relKey] = array_merge(array('name' => $relKey), $relDef); if(!empty($relationships[$relKey]['join_table']) && empty($relationships[$relKey]['fields']) && isset($dictionary[$relationships[$relKey]['join_table']]['fields'])) { $relationships[$relKey]['fields'] = $dictionary[$relationships[$relKey]['join_table']]['fields']; } } } } } //Save it out sugar_mkdir(dirname($this->getCacheFile()), null, true); $out="getCacheFile(), $out); $this->relationships = $relationships; $buildingRelCache = false; } protected function getCacheFile() { return "{$GLOBALS['sugar_config']['cache_dir']}Relationships/relationships.cache.php"; } }