Commit 0f9b3a95807e372d662f17ad46e8b0c5446ab5b4

Authored by Neil Blakey-Milner
1 parent 596a074d

Add first-pass at returning proxy objects from KTEntityUtil::get to

ensure that all instances of an entity all affect the same data.  Not
used by default.


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@5228 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing 1 changed file with 94 additions and 0 deletions
lib/ktentity.inc
... ... @@ -601,6 +601,15 @@ class KTEntityUtil {
601 601 }
602 602  
603 603 function &get($sClassName, $iId) {
  604 + /*
  605 + $sProxyClass = KTEntityUtil::_getProxyClass($sClassName);
  606 + $oObject =& new $sProxyClass($iId);
  607 + $res = $oObject->getId();
  608 + if (PEAR::isError($res)) {
  609 + return $res;
  610 + }
  611 + return $oObject;
  612 + /* */
604 613 $oObject =& KTUtil::arrayGet($GLOBALS['_OBJECTCACHE'][$sClassName], $iId);
605 614 if ($oObject) { return $oObject; }
606 615 $oObject =& new $sClassName;
... ... @@ -610,6 +619,81 @@ class KTEntityUtil {
610 619 }
611 620 $GLOBALS['_OBJECTCACHE'][$sClassName][$iId] =& $oObject;
612 621 return $oObject;
  622 + /* */
  623 + }
  624 +
  625 + function _getProxyClass($sClassName) {
  626 + $sProxyClassName = sprintf("%sProxy", $sClassName);
  627 + if (!class_exists($sProxyClassName)) {
  628 + KTEntityUtil::_proxyCreate($sClassName, $sProxyClassName);
  629 + }
  630 + return $sProxyClassName;
  631 + }
  632 +
  633 + function _proxyCreate($sClassName, $sProxyClassName) {
  634 + $oCache =& KTCache::getSingleton();
  635 + list($bCached, $mCached) = $oCache->get('ktentity/proxycreate', $sClassName);
  636 + if ($bCached) {
  637 + $code = $mCached;
  638 + } else {
  639 + $code = KTEntityUtil::_proxyBuild($sClassName, $sProxyClassName);
  640 + $oCache->set('ktentity/proxycreate', $sClassName, $code);
  641 + }
  642 + eval($code);
  643 + }
  644 + function _proxyBuild($sClassName, $sProxyClassName) {
  645 + // var_dump("Building proxy for $sClassName");
  646 + $methods = get_class_methods($sClassName);
  647 + $allcode = array();
  648 + foreach ($methods as $sMethod) {
  649 + $code = sprintf('function %s() { $aArgs = func_get_args(); return $this->_callOnObject("%s", $aArgs); }%s', $sMethod, $sMethod, "\n");
  650 + $allcode[] = $code;
  651 + }
  652 +
  653 + $allcode[] = sprintf('function &_fetch() {
  654 + $oObject =& KTUtil::arrayGet($GLOBALS["_OBJECTCACHE"][%s], $this->iId);
  655 + if ($oObject) { return $oObject; }
  656 + $oObject =& new %s;
  657 + $res = $oObject->load($this->iId);
  658 + if (PEAR::isError($res)) {
  659 + return $res;
  660 + }
  661 + $GLOBALS["_OBJECTCACHE"][%s][$this->iId] =& $oObject;
  662 + return $oObject;
  663 + }
  664 + ', $sClassName, $sClassName, $sClassName);
  665 +
  666 + $allcode[] = sprintf('function &_save(&$oObject) {
  667 + $GLOBALS["_OBJECTCACHE"][%s][$this->iId] =& $oObject;
  668 + }
  669 + ', $sClassName);
  670 +
  671 + $allcode[] = 'function &_callOnObject($sName, $aArgs) {
  672 + $oObject =& $this->_fetch();
  673 + if (PEAR::isError($oObject)) {
  674 + return $oObject;
  675 + }
  676 + // $res = call_user_func_array(array(&$oObject, $sName), $aArgs);
  677 + $aExecArgs = array();
  678 + $exec = \'$res =& $oObject->$sName(\';
  679 + foreach (array_keys($aArgs) as $iKey) {
  680 + $aExecArgs[] = \'$aArgs[\' . $iKey . \']\';
  681 + }
  682 + $exec .= join(", ", $aExecArgs);
  683 + $exec .= \');\';
  684 + eval($exec);
  685 + $this->_save($oObject);
  686 + return $res;
  687 + }
  688 + ';
  689 +
  690 + $allcode[] = sprintf('function %s ($iId) { $this->iId = $iId; }' . "\n", $sProxyClassName);
  691 +
  692 + $gen = sprintf("class %s extends %s {\n", $sProxyClassName, $sClassName);
  693 + $gen .= " " . join("\n ", $allcode) . "\n";
  694 + $gen .= "}";
  695 +
  696 + return $gen;
613 697 }
614 698  
615 699 function _getBy_equals($sField, $aValue) {
... ... @@ -630,6 +714,16 @@ class KTEntityUtil {
630 714 return array("$sField NOT IN ($sParam)", array($aParam));
631 715 }
632 716  
  717 + function _getBy_after($sField, $aValue) {
  718 + $aParam = $aValue['value'];
  719 + return array("$sField > ?", array($aParam));
  720 + }
  721 +
  722 + function _getBy_before($sField, $aValue) {
  723 + $aParam = $aValue['value'];
  724 + return array("$sField < ?", array($aParam));
  725 + }
  726 +
633 727 function &getBy($sClassName, $aField, $mValue, $aOptions = null) {
634 728 $bMulti = KTUtil::arrayGet($aOptions, 'multi', false);
635 729 if ($bMulti) {
... ...