コード例 #1
0
ファイル: metamodel.class.php プロジェクト: henryavila/itop
 public static function MakeSingleRow($sClass, $iKey, $bMustBeFound = true, $bAllowAllData = false, $aModifierProperties = null)
 {
     // Build the query cache signature
     //
     $sQuerySign = $sClass;
     if ($bAllowAllData) {
         $sQuerySign .= '_all_';
     }
     if (count($aModifierProperties)) {
         array_multisort($aModifierProperties);
         $sModifierProperties = json_encode($aModifierProperties);
         $sQuerySign .= '_all_' . md5($sModifierProperties);
     }
     if (!array_key_exists($sQuerySign, self::$aQueryCacheGetObject)) {
         // NOTE: Quick and VERY dirty caching mechanism which relies on
         //       the fact that the string '987654321' will never appear in the
         //       standard query
         //       This could be simplified a little, relying solely on the query cache,
         //       but this would slow down -by how much time?- the application
         $oFilter = new DBObjectSearch($sClass);
         $oFilter->AddCondition('id', 987654321, '=');
         if ($aModifierProperties) {
             foreach ($aModifierProperties as $sPluginClass => $aProperties) {
                 foreach ($aProperties as $sProperty => $value) {
                     $oFilter->SetModifierProperty($sPluginClass, $sProperty, $value);
                 }
             }
         }
         if ($bAllowAllData) {
             $oFilter->AllowAllData();
         }
         $sSQL = $oFilter->MakeSelectQuery();
         self::$aQueryCacheGetObject[$sQuerySign] = $sSQL;
         self::$aQueryCacheGetObjectHits[$sQuerySign] = 0;
     } else {
         $sSQL = self::$aQueryCacheGetObject[$sQuerySign];
         self::$aQueryCacheGetObjectHits[$sQuerySign] += 1;
         //			echo " -load $sClass/$iKey- ".self::$aQueryCacheGetObjectHits[$sQuerySign]."<br/>\n";
     }
     $sSQL = str_replace(CMDBSource::Quote(987654321), CMDBSource::Quote($iKey), $sSQL);
     $res = CMDBSource::Query($sSQL);
     $aRow = CMDBSource::FetchArray($res);
     CMDBSource::FreeResult($res);
     if ($bMustBeFound && empty($aRow)) {
         throw new CoreException("No result for the single row query: '{$sSQL}'");
     }
     return $aRow;
 }