Commit 0f9b3a95807e372d662f17ad46e8b0c5446ab5b4
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) { | ... | ... |