2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4 * SugarCRM Community Edition is a customer relationship management program developed by
5 * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
7 * This program is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU Affero General Public License version 3 as published by the
9 * Free Software Foundation with the addition of the following permission added
10 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
19 * You should have received a copy of the GNU Affero General Public License along with
20 * this program; if not, see http://www.gnu.org/licenses or write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
27 * The interactive user interfaces in modified source and object code versions
28 * of this program must display Appropriate Legal Notices, as required under
29 * Section 5 of the GNU Affero General Public License version 3.
31 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32 * these Appropriate Legal Notices must retain the display of the "Powered by
33 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34 * technical reasons, the Appropriate Legal Notices must display the words
35 * "Powered by SugarCRM".
36 ********************************************************************************/
39 require_once('data/SugarBean.php');
42 protected static $loadedBeans = array();
43 protected static $maxLoaded = 10;
44 protected static $total = 0;
45 protected static $loadOrder = array();
46 protected static $touched = array();
47 public static $hits = 0;
50 * Returns a SugarBean object by id. The Last 10 loaded beans are cached in memory to prevent multiple retrieves per request.
51 * If no id is passed, a new bean is created.
53 * @param String $module
57 public static function getBean($module, $id = null)
59 if (!isset(self::$loadedBeans[$module])) {
60 self::$loadedBeans[$module] = array();
61 self::$touched[$module] = array();
64 $beanClass = self::getBeanName($module);
66 if (empty($beanClass) || !class_exists($beanClass)) return false;
70 if (empty(self::$loadedBeans[$module][$id]))
72 $bean = new $beanClass();
73 $result = $bean->retrieve($id);
77 self::registerBean($module, $bean, $id);
81 self::$touched[$module][$id]++;
82 $bean = self::$loadedBeans[$module][$id];
85 $bean = new $beanClass();
91 public static function newBean($module)
93 return self::getBean($module);
96 public static function getBeanName($module)
99 if (empty($beanList[$module])) return false;
101 return $beanList[$module];
105 * Returns the object name / dictionary key for a given module. This should normally
106 * be the same as the bean name, but may not for special case modules (ex. Case vs aCase)
108 * @param String $module
111 public static function getObjectName($module)
114 if (empty($objectList[$module]))
115 return self::getBeanName($module);
117 return $objectList[$module];
123 * This function registers a bean with the bean factory so that it can be access from accross the code without doing
124 * multiple retrieves. Beans should be registered as soon as they have an id.
125 * @param String $module
126 * @param SugarBean $bean
127 * @param bool|String $id
128 * @return bool true if the bean registered successfully.
130 public static function registerBean($module, $bean, $id=false)
133 if (empty($beanList[$module])) return false;
135 if (!isset(self::$loadedBeans[$module]))
136 self::$loadedBeans[$module] = array();
138 //Do not double register a bean
139 if (!empty($id) && isset(self::$loadedBeans[$module][$id]))
142 $index = "i" . (self::$total % self::$maxLoaded);
143 //We should only hold a limited number of beans in memory at a time.
144 //Once we have the max, unload the oldest bean.
145 if (count(self::$loadOrder) >= self::$maxLoaded - 1)
147 for($i = 0; $i < self::$maxLoaded; $i++)
149 if (isset(self::$loadOrder[$index]))
151 $info = self::$loadOrder[$index];
152 //If a bean isn't in the database yet, we need to hold onto it.
153 if (!empty(self::$loadedBeans[$info['module']][$info['id']]->in_save))
157 //Beans that have been used recently should be held in memory if possible
158 else if (!empty(self::$touched[$info['module']][$info['id']]) && self::$touched[$info['module']][$info['id']] > 0)
160 self::$touched[$info['module']][$info['id']]--;
168 $index = "i" . (self::$total % self::$maxLoaded);
170 if (isset(self::$loadOrder[$index]))
172 unset(self::$loadedBeans[$info['module']][$info['id']]);
173 unset(self::$touched[$info['module']][$info['id']]);
174 unset(self::$loadOrder[$index]);
178 if(!empty($bean->id))
183 self::$loadedBeans[$module][$id] = $bean;
185 self::$loadOrder[$index] = array("module" => $module, "id" => $id);
186 self::$touched[$module][$id] = 0;