Commit dba9db8d73d95051edd642b1a50a787cde513486

Authored by Neil Blakey-Milner
1 parent ecc75534

Only cache the result of the database query, not the objects created.


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@5066 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing 1 changed file with 59 additions and 50 deletions
lib/ktentity.inc
@@ -44,11 +44,14 @@ class KTEntity { @@ -44,11 +44,14 @@ class KTEntity {
44 function clearCachedGroups() { 44 function clearCachedGroups() {
45 $groups = $this->_cachedGroups(); 45 $groups = $this->_cachedGroups();
46 $oCache =& KTCache::getSingleton(); 46 $oCache =& KTCache::getSingleton();
47 - foreach ($groups as $group) { 47 + $aSuffixes = array('', '_count', '_fullselect');
  48 + foreach ($groups as $group_base) {
48 global $default; 49 global $default;
49 - $group = sprintf("%s/%s", get_class($this), $group);  
50 - $default->log->debug("Clearing cached group: $group");  
51 - $oCache->clear($group); 50 + foreach ($aSuffixes as $sSuffix) {
  51 + $group = sprintf("%s/%s%s", get_class($this), $group_base, $sSuffix);
  52 + $default->log->debug("Clearing cached group: $group");
  53 + $oCache->clear($group);
  54 + }
52 } 55 }
53 } 56 }
54 57
@@ -264,6 +267,7 @@ class KTEntityUtil { @@ -264,6 +267,7 @@ class KTEntityUtil {
264 } 267 }
265 268
266 function &getList($sTable, $sClassName, $sWhereClause = null, $aOptions = null) { 269 function &getList($sTable, $sClassName, $sWhereClause = null, $aOptions = null) {
  270 + global $default;
267 if (is_null($aOptions)) { 271 if (is_null($aOptions)) {
268 $aOptions = array(); 272 $aOptions = array();
269 } 273 }
@@ -273,7 +277,6 @@ class KTEntityUtil { @@ -273,7 +277,6 @@ class KTEntityUtil {
273 $cache = KTUtil::arrayGet($aOptions, 'cache', false); 277 $cache = KTUtil::arrayGet($aOptions, 'cache', false);
274 $fullselect = KTUtil::arrayGet($aOptions, 'fullselect', false); 278 $fullselect = KTUtil::arrayGet($aOptions, 'fullselect', false);
275 if ($cache) { 279 if ($cache) {
276 - global $default;  
277 if (is_array($sWhereClause)) { 280 if (is_array($sWhereClause)) {
278 $vals = serialize($sWhereClause[1]); 281 $vals = serialize($sWhereClause[1]);
279 } else { 282 } else {
@@ -282,77 +285,83 @@ class KTEntityUtil { @@ -282,77 +285,83 @@ class KTEntityUtil {
282 $default->log->debug(sprintf("Trying object cache for class %s, %s: %s", $sClassName, $cache, $vals)); 285 $default->log->debug(sprintf("Trying object cache for class %s, %s: %s", $sClassName, $cache, $vals));
283 286
284 $oCache =& KTCache::getSingleton(); 287 $oCache =& KTCache::getSingleton();
285 - $group = sprintf("%s/%s", $sClassName, $cache);  
286 - list($bCached, $mCached) = $oCache->get($group, $vals);  
287 - if ($bCached) {  
288 - $default->log->debug(sprintf("Using object cache for class %s, %s: %s", $sClassName, $cache, $vals));  
289 - return $mCached;  
290 - /* */ 288 + $suffix = '';
  289 + if ($fullselect) {
  290 + $suffix = '_fullselect';
291 } 291 }
  292 + $group = sprintf("%s/%s%s", $sClassName, $cache, $suffix);
  293 + list($bCached, $mCached) = $oCache->get($group, $vals);
  294 + } else {
  295 + $bCached = false;
292 } 296 }
293 - if (!empty($fullselect)) {  
294 - $oObject = new $sClassName;  
295 - $select = $oObject->_getSqlSelection();  
296 - $sQuery = "SELECT $select FROM " . $sTable;/*ok*/ 297 +
  298 + if ($bCached) {
  299 + $default->log->debug(sprintf("Using object cache for class %s, %s: %s", $sClassName, $cache, $vals));
  300 + $aIDs = $mCached;
  301 + /* */
297 } else { 302 } else {
298 - $sIDField = KTUtil::arrayGet($aOptions, "idfield", 'id');  
299 - $sQuery = "SELECT $sIDField FROM " . $sTable;/*ok*/  
300 - }  
301 - $aParams = array();  
302 - if (!is_null($sWhereClause)) {  
303 - if (is_string($sWhereClause)) {  
304 - if (substr($sWhereClause, 0, 5) != 'WHERE') {  
305 - if (substr($sWhereClause, 0, 5) != 'ORDER') {  
306 - $sQuery .= ' WHERE'; 303 + if (!empty($fullselect)) {
  304 + $oObject = new $sClassName;
  305 + $select = $oObject->_getSqlSelection();
  306 + $sQuery = "SELECT $select FROM " . $sTable;/*ok*/
  307 + } else {
  308 + $sIDField = KTUtil::arrayGet($aOptions, "idfield", 'id');
  309 + $sQuery = "SELECT $sIDField FROM " . $sTable;/*ok*/
  310 + }
  311 + $aParams = array();
  312 + if (!is_null($sWhereClause)) {
  313 + if (is_string($sWhereClause)) {
  314 + if (substr($sWhereClause, 0, 5) != 'WHERE') {
  315 + if (substr($sWhereClause, 0, 5) != 'ORDER') {
  316 + $sQuery .= ' WHERE';
  317 + }
307 } 318 }
308 - }  
309 - $sQuery .= ' ' . $sWhereClause;  
310 - } else if (is_array($sWhereClause)) {  
311 - if (substr($sWhereClause[0], 0, 5) != 'WHERE') {  
312 - if (substr($sWhereClause[0], 0, 5) != 'ORDER') {  
313 - $sQuery .= ' WHERE'; 319 + $sQuery .= ' ' . $sWhereClause;
  320 + } else if (is_array($sWhereClause)) {
  321 + if (substr($sWhereClause[0], 0, 5) != 'WHERE') {
  322 + if (substr($sWhereClause[0], 0, 5) != 'ORDER') {
  323 + $sQuery .= ' WHERE';
  324 + }
314 } 325 }
  326 + $sQuery .= ' ' . $sWhereClause[0];
  327 + $aParams = $sWhereClause[1];
  328 + } else {
  329 + return new PEAR_Error('Weird WhereClause passed');
315 } 330 }
316 - $sQuery .= ' ' . $sWhereClause[0];  
317 - $aParams = $sWhereClause[1];  
318 - } else {  
319 - return new PEAR_Error('Weird WhereClause passed');  
320 } 331 }
321 - }  
322 - $sOrderBy = KTUtil::arrayGet($aOptions, 'orderby');  
323 - if (!empty($sOrderBy)) {  
324 - $sQuery .= " ORDER BY " . $sOrderBy;  
325 - } 332 + $sOrderBy = KTUtil::arrayGet($aOptions, 'orderby');
  333 + if (!empty($sOrderBy)) {
  334 + $sQuery .= " ORDER BY " . $sOrderBy;
  335 + }
326 336
327 - if (!empty($fullselect)) {  
328 - $aIDs = DBUtil::getResultArray(array($sQuery, $aParams));  
329 - } else {  
330 - $aIDs = DBUtil::getResultArrayKey(array($sQuery, $aParams), $sIDField); 337 + if (!empty($fullselect)) {
  338 + $aIDs = DBUtil::getResultArray(array($sQuery, $aParams));
  339 + } else {
  340 + $aIDs = DBUtil::getResultArrayKey(array($sQuery, $aParams), $sIDField);
  341 + }
331 } 342 }
332 343
333 if (PEAR::isError($aIDs)) { 344 if (PEAR::isError($aIDs)) {
334 return $aIDs; 345 return $aIDs;
335 } 346 }
336 347
  348 + if ($cache && !$bCached) {
  349 + $default->log->debug(sprintf("Setting object cache for class %s, %s, %s", $sClassName, $cache, $vals));
  350 + $oCache->set($group, $vals, $aIDs);
  351 + }
  352 +
337 if ($bIDs === true) { 353 if ($bIDs === true) {
338 return $aIDs; 354 return $aIDs;
339 } 355 }
340 356
341 if (!empty($fullselect)) { 357 if (!empty($fullselect)) {
342 $aRet =& KTEntityUtil::loadFromArrayMulti($sClassName, $aIDs); 358 $aRet =& KTEntityUtil::loadFromArrayMulti($sClassName, $aIDs);
343 - if ($cache) {  
344 - $oCache->set($group, $vals, $aRet);  
345 - }  
346 return $aRet; 359 return $aRet;
347 } 360 }
348 $aRet = array(); 361 $aRet = array();
349 foreach ($aIDs as $iId) { 362 foreach ($aIDs as $iId) {
350 $aRet[] =& call_user_func(array($sClassName, 'get'), $iId); 363 $aRet[] =& call_user_func(array($sClassName, 'get'), $iId);
351 } 364 }
352 - if ($cache) {  
353 - $default->log->debug(sprintf("Setting object cache for class %s, %s, %s", $sClassName, $cache, $vals));  
354 - $oCache->set($group, $vals, $aRet);  
355 - }  
356 return $aRet; 365 return $aRet;
357 } 366 }
358 367