Explorar o código

Fixed Trac #447: interfaces not showing up on the details of a server when an org is selected: there were collisions in the internal query parameters names ! This is now fixed.

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@1455 a333f486-631f-4898-b8df-5754b55c2be0
dflaven %!s(int64=14) %!d(string=hai) anos
pai
achega
aa4f6a33b2
Modificáronse 2 ficheiros con 119 adicións e 1 borrados
  1. 49 1
      core/dbobjectsearch.class.php
  2. 70 0
      core/expression.class.inc.php

+ 49 - 1
core/dbobjectsearch.class.php

@@ -65,6 +65,7 @@ class DBObjectSearch
 		$this->m_aReferencedBy = array();
 		$this->m_aRelatedTo = array();
 		$this->m_bDataFiltered = false;
+		$this->m_aParentConditions = array();
 	}
 
 	public function AllowAllData() {$this->m_bAllowAllData = true;}
@@ -271,16 +272,63 @@ class DBObjectSearch
 
 	protected function TransferConditionExpression($oFilter, $aTranslation)
 	{
+		// Prevent collisions in the parameter names by renaming them if needed
+		foreach($this->m_aParams as $sParam => $value)
+		{
+			if (array_key_exists($sParam, $oFilter->m_aParams) && ($value != $oFilter->m_aParams[$sParam]))
+			{
+				// Generate a new and unique name for the collinding parameter
+				$index = 1;
+				while(array_key_exists($sParam.$index, $oFilter->m_aParams))
+				{
+					$index++;
+				}
+				$secondValue = $oFilter->m_aParams[$sParam];
+				$oFilter->RenameParam($sParam, $sParam.$index);
+				unset($oFilter->m_aParams[$sParam]);
+				$oFilter->m_aParams[$sParam.$index] = $secondValue;
+			}
+		}
 //echo "<p>TransferConditionExpression:<br/>";
 //echo "Adding Conditions:<br/><pre>oFilter:\n".print_r($oFilter, true)."\naTranslation:\n".print_r($aTranslation, true)."</pre>\n";
 //echo "</p>";
 		$oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false, false /* leave unresolved fields */);
 //echo "Adding Conditions (translated):<br/><pre>".print_r($oTranslated, true)."</pre>\n";
 		$this->AddConditionExpression($oTranslated);
-		// #@# what about collisions in parameter names ???
 		$this->m_aParams = array_merge($this->m_aParams, $oFilter->m_aParams);
 	}
 
+	protected function RenameParam($sOldName, $sNewName)
+	{
+		$this->m_oSearchCondition->RenameParam($sOldName, $sNewName);
+		foreach($this->m_aRelatedTo as $aRelatedTo)
+		{
+			$aRelatedTo['flt']->RenameParam($sOldName, $sNewName);
+		}
+		foreach($this->m_aPointingTo as $sExtKeyAttCode=>$aPointingTo)
+		{
+			foreach($aPointingTo as $iOperatorCode => $aFilter)
+			{
+				foreach($aFilter as $sAlias => $oExtFilter)
+				{
+					$oExtFilter->RenameParam($sOldName, $sNewName);
+				}
+			}
+		}
+		foreach($this->m_aReferencedBy as $sForeignClass => $aReferences)
+		{
+			foreach($aReferences as $sForeignExtKeyAttCode => $oForeignFilter)
+			{
+				$oForeignFilter->RenameParam($sOldName, $sNewName);
+			}
+		}
+
+		foreach($this->m_aParentConditions as $aParent)
+		{
+			$aParent['expression']->RenameParam($sOldName, $sNewName);	
+		}
+	}
+	
 	public function ResetCondition()
 	{
 		$this->m_oSearchCondition = new TrueExpression();

+ 70 - 0
core/expression.class.inc.php

@@ -84,6 +84,8 @@ abstract class Expression
 	{
 		return new BinaryExpression($this, 'OR', $oExpr);
 	}
+	
+	abstract public function RenameParam($sOldName, $sNewName);
 }
 
 class SQLExpression extends Expression
@@ -119,6 +121,11 @@ class SQLExpression extends Expression
 	{
 		return array();
 	}
+	
+	public function RenameParam($sOldName, $sNewName)
+	{
+		// Do nothing, since there is nothing to rename
+	}
 }
 
 
@@ -205,6 +212,12 @@ class BinaryExpression extends Expression
 		$aRight = $this->GetRightExpr()->ListRequiredFields();
 		return array_merge($aLeft, $aRight);
 	}
+	
+	public function RenameParam($sOldName, $sNewName)
+	{
+		$this->GetLeftExpr()->RenameParam($sOldName, $sNewName);
+		$this->GetRightExpr()->RenameParam($sOldName, $sNewName);
+	}
 }
 
 
@@ -256,6 +269,12 @@ class UnaryExpression extends Expression
 	{
 		return array();
 	}
+	
+	public function RenameParam($sOldName, $sNewName)
+	{
+		// Do nothing
+		// really ? what about :param{$iParamIndex} ??
+	}
 }
 
 class ScalarExpression extends UnaryExpression
@@ -429,6 +448,14 @@ class VariableExpression extends UnaryExpression
 			throw new MissingQueryArgument('Missing query argument', array('expecting'=>$this->m_sName, 'available'=>$aArgs));
 		}
 	}
+	
+	public function RenameParam($sOldName, $sNewName)
+	{
+		if ($this->m_sName == $sOldName)
+		{
+			$this->m_sName = $sNewName;
+		}
+	}
 }
 
 // Temporary, until we implement functions and expression casting!
@@ -501,6 +528,15 @@ class ListExpression extends Expression
 		}
 		return $aRes;
 	}
+	
+	public function RenameParam($sOldName, $sNewName)
+	{
+		$aRes = array();
+		foreach ($this->m_aExpressions as $key => $oExpr)
+		{
+			$this->m_aExpressions[$key] = $oExpr->RenameParam($sOldName, $sNewName);
+		}
+	}	
 }
 
 
@@ -569,6 +605,14 @@ class FunctionExpression extends Expression
 		}
 		return $aRes;
 	}
+	
+	public function RenameParam($sOldName, $sNewName)
+	{
+		foreach ($this->m_aArgs as $key => $oExpr)
+		{
+			$this->m_aArgs[$key] = $oExpr->RenameParam($sOldName, $sNewName);
+		}
+	}	
 }
 
 class IntervalExpression extends Expression
@@ -618,6 +662,11 @@ class IntervalExpression extends Expression
 	{
 		return array();
 	}
+	
+	public function RenameParam($sOldName, $sNewName)
+	{
+		$this->m_oValue->RenameParam($sOldName, $sNewName);
+	}	
 }
 
 class CharConcatExpression extends Expression
@@ -680,6 +729,14 @@ class CharConcatExpression extends Expression
 		}
 		return $aRes;
 	}
+
+	public function RenameParam($sOldName, $sNewName)
+	{
+		foreach ($this->m_aExpressions as $key => $oExpr)
+		{
+			$this->m_aExpressions[$key] = $oExpr->RenameParam($sOldName, $sNewName);
+		}
+	}	
 }
 
 
@@ -778,6 +835,19 @@ class QueryBuilderExpressions
 			$this->m_aJoinFields[$index] = $oExpression->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		}
 	}
+
+	public function RenameParam($sOldName, $sNewName)
+	{
+		$this->m_oConditionExpr->RenameParam($sOldName, $sNewName);
+		foreach($this->m_aSelectExpr as $sColAlias => $oExpr)
+		{
+			$this->m_aSelectExpr[$sColAlias] = $oExpr->RenameParam($sOldName, $sNewName);
+		}
+		foreach($this->m_aJoinFields as $index => $oExpression)
+		{
+			$this->m_aJoinFields[$index] = $oExpression->RenameParam($sOldName, $sNewName);
+		}
+	}
 }
 
 ?>