📄 ktentity.inc.svn-base
字号:
$ret = $oObject->create(); if (PEAR::isError($ret)) { return $ret; } if ($ret === false) { return PEAR::raiseError(sprintf(_kt("create for class %s failed"), $sClassName)); } $meth = array($sClassName, 'get'); return call_user_func($meth, $oObject->getId()); } function updateFromArray ($sClassName, $iId, $aOptions) { $oObject = new $ClassName; $ret = $oObject->load($iId); if (PEAR::isError($ret)) { return $ret; } $ret = $this->loadFromArray($aOptions); if (PEAR::isError($ret)) { return $ret; } $ret = $this->update(); if (PEAR::isError($ret)) { return $ret; } if ($ret === false) { return PEAR::raiseError(sprintf(_kt("update for class %s failed"), $sClassName)); } return true; } function &loadFromArray ($sClassName, $aArray, $aOptions = null) { $oObject =new $ClassName; $ret = $oObject->loadFromArray($aArray); if (PEAR::isError($ret)) { return $ret; } return $oObject; } function &loadFromArrayMulti($sClassName, $aMultiArray, $aOptions = null) { $aRet = array(); foreach ($aMultiArray as $aArray) { $oObject =new $sClassName; $ret = $oObject->loadFromArray($aArray); if (PEAR::isError($ret)) { return $ret; } $aRet[] = $oObject; } return $aRet; } static function &get($sClassName, $iId) { if (!is_numeric($iId)) { return PEAR::raiseError(_kt('Non-numeric identifier')); } $iId = (int)$iId; /* */ $sProxyClass = KTEntityUtil::_getProxyClass($sClassName); $oObject =new $sProxyClass($iId); $res = $oObject->getId(); if (PEAR::isError($res)) { return $res; } return $oObject; /* */ // XXX Object cache currently causes hard-to-trace inconsistencies in data. // $oObject =& KTUtil::arrayGet($GLOBALS['_OBJECTCACHE'][$sClassName], $iId); // if ($oObject) { return $oObject; } $oObject =new $sClassName; $res = $oObject->load($iId); if (PEAR::isError($res)) { return $res; } // XXX Object cache currently causes hard-to-trace inconsistencies in data. //$GLOBALS['_OBJECTCACHE'][$sClassName][$iId] =& $oObject; return $oObject; /* */ } static function _getProxyClass($sClassName) { $sProxyClassName = sprintf("%sProxy", $sClassName); if (!class_exists($sProxyClassName)) { KTEntityUtil::_proxyCreate($sClassName, $sProxyClassName); } return $sProxyClassName; } static function _proxyCreate($sClassName, $sProxyClassName) { /* $code = KTEntityUtil::_proxyBuild($sClassName, $sProxyClassName); return eval($code); /* */ $oKTConfig =& KTConfig::getSingleton(); $sDirectory = $oKTConfig->get('cache/proxyCacheDirectory'); if (!file_exists($sDirectory)) { $res = @mkdir($sDirectory); } $sRunningUser = KTUtil::running_user(); if ($sRunningUser) { $sDirectory = sprintf("%s/%s", $sDirectory, $sRunningUser); } if (!file_exists($sDirectory)) { $res = @mkdir($sDirectory); } $sFilename = sprintf("%s/%s.inc.php", $sDirectory, $sProxyClassName); if (file_exists($sFilename)) { require_once($sFilename); return; } $oCache =& KTCache::getSingleton(); list($bCached, $mCached) = $oCache->get('ktentity/proxycreate', $sClassName); if ($bCached) { $code = $mCached; } else { $code = KTEntityUtil::_proxyBuild($sClassName, $sProxyClassName); $res = @file_put_contents($sFilename, "<?php\n$code"); if ($res) { require_once($sFilename); return; } $oCache->set('ktentity/proxycreate', $sClassName, $code); } eval($code); } function _proxyBuild($sClassName, $sProxyClassName) { // var_dump("Building proxy for $sClassName"); $methods = get_class_methods($sClassName); $allcode = array(); $allcode[] = sprintf('var $cacheGlobal = null;%s', "\n"); foreach ($methods as $sMethod) { if ($sMethod == 'getid') { $code = sprintf('function getId() { return $this->iId; }'); } else if ($sMethod == '_table' || $sMethod == 'update' ) { $code = sprintf('function %s() { return parent::%s(); }', $sMethod, $sMethod); } else if ($sMethod == 'get') { $code = sprintf('function get($oId) { return $this->get(%s, $oid); }', $sClassName); } else { $code = sprintf('function %s() { $aArgs = func_get_args(); return $this->_callOnObject("%s", $aArgs); }%s', $sMethod, $sMethod, "\n"); } $allcode[] = $code; } $allcode[] = sprintf('function &_fetch() { if (!empty($this->cacheGlobal[$this->iId])) { $oObject =& $this->cacheGlobal[$this->iId]; return $oObject; } $oObject =new %s; $res = $oObject->load($this->iId); if (PEAR::isError($res)) { return $res; } $this->cacheGlobal[$this->iId] =& $oObject; return $oObject; }', $sClassName, $sClassName, $sClassName, $sClassName); $allcode[] = sprintf('function _save(&$oObject) { $this->cacheGlobal[$this->iId] =& $oObject; }', $sClassName); $allcode[] = 'function &_callOnObject($sName, $aArgs) { $oObject =& $this->_fetch(); if (PEAR::isError($oObject)) { return $oObject; } /* */ $res = call_user_func_array(array(&$oObject, $sName), $aArgs); $this->cacheGlobal[$this->iId] =& $oObject; return $res; /* */ /* */ $aExecArgs = array(); $exec = \'$res =& $oObject->$sName(\'; foreach (array_keys($aArgs) as $iKey) { $aExecArgs[] = \'$aArgs[\' . $iKey . \']\'; } $exec .= join(", ", $aExecArgs); $exec .= \');\'; eval($exec); $this->cacheGlobal[$this->iId] =& $oObject; return $res; /* */ }'; $allcode[] = sprintf('function %s ($iId) { $this->iId = $iId; $this->cacheGlobal =& $GLOBALS["_OBJECTCACHE"][%s]; }' . "\n", $sProxyClassName, $sClassName); $gen = sprintf("class %s extends %s {\n", $sProxyClassName, $sClassName); $gen .= " " . join("\n ", $allcode) . "\n"; $gen .= "}"; return $gen; } static function _getBy_equals($sField, $aValue) { $aParam = $aValue['value']; if (!is_array($aParam)) { return array("$sField = ?", array($aParam)); } $sParam = DBUtil::paramArray($aParam); return array("$sField IN ($sParam)", array($aParam)); } static function _getBy_nequals($sField, $aValue) { $aParam = $aValue['value']; if (!is_array($aParam)) { return array("$sField \!= ?", array($aParam)); } $sParam = DBUtil::paramArray($aParam); return array("$sField NOT IN ($sParam)", array($aParam)); } static function _getBy_after($sField, $aValue) { $aParam = $aValue['value']; return array("$sField > ?", array($aParam)); } static function _getBy_before($sField, $aValue) { $aParam = $aValue['value']; return array("$sField < ?", array($aParam)); } static function _getBy_between($sField, $aValue) { $aParam = $aValue['value']; return array("$sField BETWEEN ? AND ?", $aParam); } static function &getBy($sClassName, $aField, $mValue, $aOptions = null) { $bMulti = KTUtil::arrayGet($aOptions, 'multi', false); if ($bMulti) { $bNoneOk = true; } else { $bNoneOk = false; } $bNoneOk = KTUtil::arrayGet($aOptions, 'noneok', $bNoneOk); if (is_string($aField)) { $aField = array($aField); $mValue = array($mValue); } $aWhere = array(); foreach ($aField as $k => $sField) { $mThisValue = $mValue[$k]; if (!is_array($mThisValue)) { $mThisValue = array('type' => 'equals', 'value' => $mThisValue); } $sField = KTUtil::arrayGet($mThisValue, 'field', $sField); $sType = KTUtil::arrayGet($mThisValue, 'type'); if (empty($sType)) { $mThisValue = array('type' => 'equals', 'value' => $mThisValue); $sType = 'equals'; } $sFunc = array('KTEntityUtil', sprintf('_getby_%s', $sType)); if (!is_callable($sFunc)) { return PEAR::raiseError(_kt('Unknown comparison type given: ') . $sType); } $aWhere[] = call_user_func($sFunc, $sField, $mThisValue); } $sWhereClause = KTUtil::whereToString($aWhere); $aObjects =& KTEntityUtil::getList2($sClassName, $sWhereClause, $aOptions); if (PEAR::isError($aObjects)) { return $aObjects; } if ($bMulti === false) { if (count($aObjects) === 0) { if ($bNoneOk) { return null; } return new KTEntityNoObjects(); } if (count($aObjects) > 1) { return PEAR::raiseError(_kt("Multiple objects returned")); } return $aObjects[0]; } else { return $aObjects; } } function &getByDict($sClassName, $aDict, $aOptions = null) { return KTEntityUtil::getBy($sClassName, array_keys($aDict), array_values($aDict), $aOptions); } function clearAllCaches($sClassName) { KTEntity::_innerClearCachedGroups($sClassName); $oCache =& KTCache::getSingleton(); $oCache->clear(sprintf("%s/id", $sClassName)); unset($GLOBALS['_OBJECTCACHE'][$sClassName]); }}class KTEntityNoObjects extends PEAR_Error {}?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -