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 44 function clearCachedGroups() {
45 45 $groups = $this->_cachedGroups();
46 46 $oCache =& KTCache::getSingleton();
47   - foreach ($groups as $group) {
  47 + $aSuffixes = array('', '_count', '_fullselect');
  48 + foreach ($groups as $group_base) {
48 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 267 }
265 268  
266 269 function &getList($sTable, $sClassName, $sWhereClause = null, $aOptions = null) {
  270 + global $default;
267 271 if (is_null($aOptions)) {
268 272 $aOptions = array();
269 273 }
... ... @@ -273,7 +277,6 @@ class KTEntityUtil {
273 277 $cache = KTUtil::arrayGet($aOptions, 'cache', false);
274 278 $fullselect = KTUtil::arrayGet($aOptions, 'fullselect', false);
275 279 if ($cache) {
276   - global $default;
277 280 if (is_array($sWhereClause)) {
278 281 $vals = serialize($sWhereClause[1]);
279 282 } else {
... ... @@ -282,77 +285,83 @@ class KTEntityUtil {
282 285 $default->log->debug(sprintf("Trying object cache for class %s, %s: %s", $sClassName, $cache, $vals));
283 286  
284 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 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 344 if (PEAR::isError($aIDs)) {
334 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 353 if ($bIDs === true) {
338 354 return $aIDs;
339 355 }
340 356  
341 357 if (!empty($fullselect)) {
342 358 $aRet =& KTEntityUtil::loadFromArrayMulti($sClassName, $aIDs);
343   - if ($cache) {
344   - $oCache->set($group, $vals, $aRet);
345   - }
346 359 return $aRet;
347 360 }
348 361 $aRet = array();
349 362 foreach ($aIDs as $iId) {
350 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 365 return $aRet;
357 366 }
358 367  
... ...