(file) Return to CQLValueRep.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / CQL

   1 chuck 1.1.2.4 //%2003////////////////////////////////////////////////////////////////////////
   2 david 1.1.2.1 //
   3 chuck 1.1.2.5 // Copyright (c) 2000, 2001, 2002  BMC Software, Hewlett-Packard Development
   4               // Company, L. P., IBM Corp., The Open Group, Tivoli Systems.
   5               // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
   6 david 1.1.2.1 // IBM Corp.; EMC Corporation, The Open Group.
   7               //
   8               // Permission is hereby granted, free of charge, to any person obtaining a copy
   9               // of this software and associated documentation files (the "Software"), to
  10               // deal in the Software without restriction, including without limitation the
  11               // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  12               // sell copies of the Software, and to permit persons to whom the Software is
  13               // furnished to do so, subject to the following conditions:
  14               // 
  15               // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  16               // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  17               // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  18               // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  19               // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  20               // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  21               // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  22               // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23               //
  24               //==============================================================================
  25               //
  26               // Author: Dave Rosckes (rosckes@us.ibm.com)
  27 david 1.1.2.1 //
  28 dj.gorey 1.1.2.21 // Modified By: Dan Gorey (djgorey@us.ibm.com)
  29 david    1.1.2.1  //
  30                   //%/////////////////////////////////////////////////////////////////////////////
  31                   
  32                   #include <cstdlib>
  33                   #include <iostream>
  34                   
  35 david    1.1.2.15 #include <Pegasus/CQL/CQLValue.h>
  36 david    1.1.2.1  #include <Pegasus/CQL/CQLValueRep.h>
  37                   #include <Pegasus/Repository/NameSpaceManager.h>
  38                   #include <Pegasus/Common/CIMClass.h>
  39 david    1.1.2.25 #include <Pegasus/Common/Tracer.h>
  40 david    1.1.2.1  #include <Pegasus/CQL/CQLIdentifier.h>
  41 dj.gorey 1.1.2.21 #include <Pegasus/CQL/CQLRegularExpression.h>
  42 david    1.1.2.1  #include <Pegasus/CQL/CQLFactory.h>
  43 david    1.1.2.25 #include <Pegasus/CQL/QueryException.h>
  44 david    1.1.2.1  
  45                   
  46                   
  47                   PEGASUS_NAMESPACE_BEGIN
  48                   PEGASUS_USING_STD;
  49                   
  50                   #define PEGASUS_ARRAY_T CQLValueRep
  51                   #include <Pegasus/Common/ArrayImpl.h>
  52                   #undef PEGASUS_ARRAY_T
  53                   
  54 david    1.1.2.18 #define PEGASUS_SINT64_MIN (PEGASUS_SINT64_LITERAL(0x8000000000000000))
  55                   #define PEGASUS_UINT64_MAX PEGASUS_UINT64_LITERAL(0xFFFFFFFFFFFFFFFF)
  56 david    1.1.2.1  #define CIMTYPE_EMBEDDED 15  //temporary
  57 humberto 1.1.2.3  
  58                   CQLValueRep::CQLValueRep()
  59 david    1.1.2.18   :_valueType(CQLValue::Null_type)
  60 humberto 1.1.2.3  {
  61                   }
  62 david    1.1.2.23 
  63 david    1.1.2.1  CQLValueRep::~CQLValueRep()
  64                   {
  65 david    1.1.2.23 
  66 david    1.1.2.1  }
  67                   
  68 david    1.1.2.18 
  69                   CQLValueRep::CQLValueRep(const CQLValueRep& val)
  70                   {
  71 david    1.1.2.23   _theValue = val._theValue;
  72 david    1.1.2.18 
  73                      _CQLChainId = val._CQLChainId;
  74                   
  75                      _isResolved = val._isResolved;
  76                   
  77                      _valueType = val._valueType;
  78 david    1.1.2.24 
  79                     
  80 david    1.1.2.18 }
  81                   
  82 david    1.1.2.1  CQLValueRep::CQLValueRep(const CQLValueRep* val)
  83                   {
  84 david    1.1.2.23   _theValue =  val->_theValue;
  85 david    1.1.2.1  
  86 david    1.1.2.23   _CQLChainId = val->_CQLChainId;
  87 david    1.1.2.1  
  88 david    1.1.2.23   _isResolved = val->_isResolved;
  89 david    1.1.2.1  
  90 david    1.1.2.23   _valueType = val->_valueType;
  91 david    1.1.2.1  }
  92                   
  93 david    1.1.2.15 CQLValueRep::CQLValueRep(const String& inString, CQLValue::NumericType inValueType, Boolean inSign)
  94 david    1.1.2.1  {
  95 david    1.1.2.25    PEG_METHOD_ENTER(TRC_CQL, "CQLValueRep::CQLValueRep()");
  96 david    1.1.2.1     CString cStr = inString.getCString();
  97                      char *endP;
  98                   
  99                      switch(inValueType)
 100                      {
 101 david    1.1.2.15       case CQLValue::Hex:
 102 david    1.1.2.1           if(inSign)
 103                            {
 104 david    1.1.2.23             _theValue.set((Uint64)strtoul((const char*)cStr,&endP,16));
 105 david    1.1.2.15             _valueType = CQLValue::Uint64_type;
 106 david    1.1.2.1           }
 107                            else
 108                            {
 109 david    1.1.2.23             _theValue.set((Sint64)strtol((const char *)cStr,&endP,16));
 110 david    1.1.2.15             _valueType = CQLValue::Sint64_type;
 111 david    1.1.2.1           }
 112                            
 113                            break;
 114 david    1.1.2.15       case CQLValue::Binary:
 115 david    1.1.2.1           if(inSign)
 116                            {
 117 david    1.1.2.23             _theValue.set((Uint64)strtoul((const char *)cStr,&endP,2));
 118 david    1.1.2.15             _valueType = CQLValue::Uint64_type;
 119 david    1.1.2.1           }
 120                            else
 121                            {
 122 david    1.1.2.23             _theValue.set((Sint64)strtol((const char *)cStr,&endP,2));
 123 david    1.1.2.15             _valueType = CQLValue::Sint64_type;
 124 david    1.1.2.1           }
 125                            break;
 126 david    1.1.2.15       case CQLValue::Decimal:
 127 david    1.1.2.1           if(inSign)
 128                            {
 129 david    1.1.2.23             _theValue.set((Uint64)strtoul((const char *)cStr,&endP,10));
 130 david    1.1.2.15             _valueType = CQLValue::Uint64_type;
 131 david    1.1.2.1           }
 132                            else
 133                            {
 134 david    1.1.2.23             _theValue.set((Sint64)strtol((const char *)cStr,&endP,10));
 135 david    1.1.2.15             _valueType = CQLValue::Sint64_type;
 136 david    1.1.2.1           }
 137                            break;
 138 david    1.1.2.15       case CQLValue::Real:
 139 david    1.1.2.1           if(inSign)
 140                            {
 141 david    1.1.2.23             _theValue.set((Real64)strtod((const char *)cStr,&endP));
 142 david    1.1.2.15             _valueType = CQLValue::Real_type;
 143 david    1.1.2.1           }
 144                            else
 145                            {
 146 david    1.1.2.23             _theValue.set((Real64)strtod((const char *)cStr,&endP));
 147 david    1.1.2.15             _valueType = CQLValue::Real_type;
 148 david    1.1.2.1           }
 149                            break;
 150                         default:
 151 david    1.1.2.25 	MessageLoaderParms mload(String("CQL.CQLValueRep.CONSTRUCTOR_FAILURE"),
 152                   				 String("Undefined case in constructor."));
 153                   	throw CQLRuntimeException(mload);
 154                   
 155                   	break;
 156 david    1.1.2.1     }
 157 david    1.1.2.25 
 158 david    1.1.2.1     _isResolved = true;
 159 david    1.1.2.25 
 160                      PEG_METHOD_EXIT();
 161 david    1.1.2.1  }
 162                   
 163                   
 164 david    1.1.2.15 CQLValueRep::CQLValueRep(const CQLChainedIdentifier& inCQLIdent)
 165 david    1.1.2.18   : _CQLChainId(inCQLIdent), 
 166                       _isResolved(false),
 167                       _valueType(CQLValue::CQLIdentifier_type)
 168 david    1.1.2.1  {
 169 david    1.1.2.18    
 170 david    1.1.2.1  }
 171                   
 172                   
 173 david    1.1.2.15 CQLValueRep::CQLValueRep(const String& inString)
 174 david    1.1.2.18   : _isResolved(true), 
 175                       _valueType(CQLValue::String_type)
 176 david    1.1.2.1  {
 177 david    1.1.2.23    _theValue.set(inString);
 178 david    1.1.2.1  }
 179                   
 180 david    1.1.2.15 CQLValueRep::CQLValueRep(const CIMInstance& inInstance)
 181 david    1.1.2.18   : _isResolved(true),
 182 david    1.1.2.23     _valueType(CQLValue::CIMObject_type)
 183 david    1.1.2.1  {
 184 david    1.1.2.25   _theValue.set((CIMObject)inInstance);
 185 david    1.1.2.1  }
 186                   
 187 david    1.1.2.15 CQLValueRep::CQLValueRep(const CIMClass& inClass)
 188 david    1.1.2.18   : _isResolved(true),
 189 david    1.1.2.23     _valueType(CQLValue::CIMObject_type)
 190 david    1.1.2.1  {
 191 david    1.1.2.25   _theValue.set((CIMObject)inClass);
 192 david    1.1.2.1  }
 193                   
 194 david    1.1.2.24 CQLValueRep::CQLValueRep(const CIMObject& inObject)
 195                     : _isResolved(true),
 196                       _valueType(CQLValue::CIMObject_type)
 197                   {
 198 david    1.1.2.25   _theValue.set((CIMObject)inObject);
 199 david    1.1.2.24 }
 200                   
 201 david    1.1.2.15 CQLValueRep::CQLValueRep(const CIMObjectPath& inObjPath)
 202 david    1.1.2.18   : _isResolved(true),
 203                       _valueType(CQLValue::CIMReference_type)
 204 david    1.1.2.1  {
 205 david    1.1.2.23    _theValue.set(inObjPath);
 206 david    1.1.2.1  }
 207                   
 208 david    1.1.2.15 CQLValueRep::CQLValueRep(const CIMDateTime& inDateTime)
 209 david    1.1.2.18   : _isResolved(true),
 210                       _valueType(CQLValue::CIMDateTime_type)
 211 david    1.1.2.1  {
 212 david    1.1.2.23    _theValue.set(inDateTime);
 213 david    1.1.2.1  }
 214                   
 215                   CQLValueRep::CQLValueRep(Uint64 inUint)
 216 david    1.1.2.18   : _isResolved(true),
 217                       _valueType(CQLValue::Uint64_type)
 218 david    1.1.2.1  {
 219 david    1.1.2.23    _theValue.set(inUint);
 220 david    1.1.2.1  }
 221                   
 222                   CQLValueRep::CQLValueRep(Boolean inBool)
 223 david    1.1.2.18   : _isResolved(true),
 224                       _valueType(CQLValue::Boolean_type)
 225 david    1.1.2.1  {
 226 david    1.1.2.23    _theValue.set(inBool);
 227 david    1.1.2.1  }
 228                   
 229                   CQLValueRep::CQLValueRep(Sint64 inSint)
 230 david    1.1.2.18   : _isResolved(true),
 231                       _valueType(CQLValue::Sint64_type)
 232 david    1.1.2.1  {
 233 david    1.1.2.23    _theValue.set(inSint);
 234 david    1.1.2.1  }
 235                   
 236                   CQLValueRep::CQLValueRep(Real64 inReal)
 237 david    1.1.2.18   : _isResolved(true),
 238                       _valueType(CQLValue::Real_type)
 239 david    1.1.2.1  {
 240 david    1.1.2.23    _theValue.set(inReal);
 241 david    1.1.2.1  }
 242                   
 243 david    1.1.2.24 CQLValueRep::CQLValueRep(const CIMValue& inVal)
 244                   {
 245                     _setValue(inVal);
 246                   }
 247                   
 248 david    1.1.2.17 void CQLValueRep::resolve(const CIMInstance& CI, const  QueryContext& inQueryCtx)
 249 chuck    1.1.2.22 { 
 250 david    1.1.2.18   if(_CQLChainId.size() == 0)
 251                       {
 252 david    1.1.2.1        return;
 253 david    1.1.2.18     }
 254                     
 255 david    1.1.2.1  
 256 david    1.1.2.18   Array<CQLIdentifier> Idstrings = 
 257                       _CQLChainId.getSubIdentifiers(); // Array of Identifiers to process
 258                     
 259                     Uint32 index = 0;                // Counter for looping through Identifiers
 260                     CIMProperty propObj;  
 261                     
 262                     if(Idstrings.size() == 1)
 263                       {
 264 david    1.1.2.1        // A class was passed in with no property indicated.
 265                         // Set the instance passed in, as a primitive.
 266 david    1.1.2.25       _theValue.set((CIMObject)CI);
 267 david    1.1.2.23       _valueType = CQLValue::CIMObject_type;
 268 david    1.1.2.1        _isResolved = true;
 269                         return; // Done.
 270 david    1.1.2.18     }
 271                     else
 272                       {
 273                         // Symbolic Constant processing
 274                         if(_CQLChainId.getLastIdentifier().isSymbolicConstant() &&
 275                   	 Idstrings.size() == 2)
 276                   	{
 277                   	  _resolveSymbolicConstant(inQueryCtx);
 278                   	  return;
 279                   	}
 280                         
 281 david    1.1.2.1        // Need to increment index since the first Identifier is a class,
 282                         // and additional identifiers need processing.
 283                         ++index;
 284 david    1.1.2.18      }
 285                     
 286                     CIMName classContext = Idstrings[0].getName();
 287                     CIMObject objectContext = CI;
 288 david    1.1.2.25    
 289 david    1.1.2.18   for(;index < Idstrings.size(); ++index)
 290                       {
 291 david    1.1.2.1        // Now we need to verify that the property is in the class.
 292 david    1.1.2.18       Uint32 propertyIndex = objectContext.findProperty(Idstrings[index].getName());
 293                         
 294 david    1.1.2.1        if(propertyIndex == PEG_NOT_FOUND)
 295 david    1.1.2.18 	{
 296                   	  _valueType = CQLValue::Null_type;
 297                   	  return;
 298                   	}
 299                         
 300 david    1.1.2.1        // We will check the property type to determine what processing 
 301                         // needs to be done.
 302 david    1.1.2.18       propObj = objectContext.getProperty(propertyIndex);
 303 chuck    1.1.2.22 
 304                         /*      
 305 david    1.1.2.18       if(inQueryCtx.getClassRelation(Idstrings[index].getScope(),classContext)
 306                   	 == QueryContext::NOTRELATED)
 307                   	{
 308                   	  // The chain is not inline with scope.
 309                   	  _valueType = CQLValue::Null_type;
 310                   	  return;
 311                   	}
 312 chuck    1.1.2.22       */
 313 david    1.1.2.18       
 314                         if(index == Idstrings.size()-1)
 315                   	{
 316                   	  _process_value(propObj,Idstrings[index],inQueryCtx);
 317 david    1.1.2.25 	  return;
 318 david    1.1.2.18 	}
 319                         else if(propObj.getType() != CIMTYPE_EMBEDDED)
 320                   	{
 321                   	  // Object is not embedded.
 322                   	  _valueType = CQLValue::Null_type;
 323                   	  return;
 324                   	}
 325 david    1.1.2.25       propObj.getValue().get(objectContext);
 326 david    1.1.2.18       classContext = objectContext.getClassName();
 327                       }  
 328 david    1.1.2.1  } // end of function
 329                   
 330 david    1.1.2.18 void CQLValueRep::_process_value(CIMProperty& propObj,
 331                   				 CQLIdentifier& _id,
 332                   				 const QueryContext& inQueryCtx)
 333                   {
 334                     if(propObj.getType() == CIMTYPE_EMBEDDED)
 335                       {
 336                         CIMObject cimObj;
 337 david    1.1.2.25       propObj.getValue().get(cimObj);
 338 david    1.1.2.18 
 339 david    1.1.2.25       _theValue.set(cimObj);
 340                         _valueType = CQLValue::CIMObject_type;
 341 david    1.1.2.18     }
 342                     else // Primitive
 343                       {
 344                         if(_id.isArray())
 345                   	{
 346                   	  // We have an array property.  All we need to do
 347                   	  // Is get the index defined by CQLIdentifier.
 348                   	  // NOTE: Basic CQL support only allows one index.
 349                   	  _setValue(propObj.getValue(),
 350                   		    _id.getSubRanges()[0].start);
 351                   	  return;
 352                   	}
 353                         else if(_id.isSymbolicConstant())
 354                   	{
 355                   	  // Symbolic Constant processing
 356                   	  _resolveSymbolicConstant(inQueryCtx);
 357                   	  return;
 358                   	}
 359                         else
 360                   	{
 361                   	  // The property has no special charactors.
 362 david    1.1.2.24 	  if(propObj.isArray())
 363                   	    {
 364                   	      Uint32 qualIndex = propObj.findQualifier(CIMName(String("ArrayType")));
 365                   	      propObj.getQualifier(qualIndex).getValue().get(_ArrayType);
 366                   	    }
 367 david    1.1.2.18 	  _setValue(propObj.getValue());
 368                   	  return;
 369                   	}
 370                       }
 371                   }
 372                   
 373 david    1.1.2.23 CQLValueRep& CQLValueRep::operator=(const CQLValueRep& rhs)
 374                   {
 375 david    1.1.2.1  
 376 david    1.1.2.23   if(&rhs != this)
 377                       {
 378                         _valueType = rhs._valueType;
 379                         _theValue = rhs._theValue;
 380                         _CQLChainId = rhs._CQLChainId;
 381                         _isResolved = rhs._isResolved;
 382                       }
 383                     return *this;
 384 david    1.1.2.1  }
 385                   Boolean CQLValueRep::operator==(const CQLValueRep& x)
 386                   {
 387 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL, "CQLValueRep::operator==");
 388 david    1.1.2.18   _validate(x);
 389 david    1.1.2.6  
 390 david    1.1.2.24   if(_theValue.isArray())
 391                       {
 392                         return _compareArray(x);
 393                       }
 394                     else if((_theValue.getType() == x._theValue.getType()) &&
 395 david    1.1.2.23      (_valueType != CQLValue::CIMObject_type) &&
 396 david    1.1.2.24      (_valueType != CQLValue::CQLIdentifier_type))
 397 david    1.1.2.23     {
 398                         return _theValue == x._theValue;
 399                       }
 400                     else
 401                       {
 402                         Uint64 tmpU64;
 403                         Sint64 tmpS64;
 404                         Real64 tmpR64;
 405                         
 406                         switch(_valueType)
 407                   	{
 408                   	case CQLValue::Null_type:
 409                   	  {
 410                   	    if(x._valueType == CQLValue::Null_type)
 411 david    1.1.2.18 	      {
 412                   		return true;
 413                   	      }
 414 david    1.1.2.23 	  }
 415                   	  break;
 416                   	  
 417                   	case CQLValue::Sint64_type:
 418                   	  {
 419                   	    _theValue.get(tmpS64);
 420                   	    if(x._valueType == CQLValue::Uint64_type)
 421                   	      {
 422                   		x._theValue.get(tmpU64);
 423                   		
 424                   		if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 425                   		  {
 426                   		    return false;
 427                   		  }
 428                   		else
 429                   		  {
 430                   		    return (Sint64)tmpU64 == tmpS64;
 431                   		  }
 432                   	      }
 433                   	    else 
 434                   	      {
 435 david    1.1.2.23 		x._theValue.get(tmpR64);
 436                   		
 437                   		return tmpR64 == tmpS64;
 438                   	      }
 439                   	    break;
 440                   	  }
 441                   	case CQLValue::Uint64_type:
 442                   	  {
 443                   	    _theValue.get(tmpU64);
 444                   	    if(x._valueType == CQLValue::Sint64_type)
 445                   	      {
 446                   		x._theValue.get(tmpS64);
 447                   		
 448                   		if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 449                   		  {
 450                   		    return false;
 451                   		  }
 452                   		else
 453                   		  {
 454                   		    return (Sint64)tmpU64 == tmpS64;
 455                   		  }
 456 david    1.1.2.23 	      }
 457                   	    else 
 458                   	      {
 459                   		x._theValue.get(tmpR64);
 460                   		if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 461                   		  {
 462                   		    return false;
 463                   		  }
 464                   		else
 465                   		  {
 466                   		    return tmpR64 == (Sint64)tmpU64;
 467                   		  }
 468                   	      }
 469                   	    break;
 470                   	  }
 471                   	case CQLValue::Real_type:
 472                   	  {
 473                   	    _theValue.get(tmpR64);
 474                   	    if(x._valueType == CQLValue::Uint64_type)
 475                   	      {
 476                   		x._theValue.get(tmpU64);
 477 david    1.1.2.23 		
 478                   		if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 479                   		  {
 480                   		    return false;
 481                   		  }
 482                   		else
 483                   		  {
 484                   		    return (Sint64)tmpU64 == tmpR64;
 485                   		  }
 486                   	      }
 487                   	    else 
 488                   	      {
 489                   		x._theValue.get(tmpS64);
 490                   		
 491                   		return tmpR64 == tmpS64;
 492                   	      }
 493                   	    break;
 494                   	  }
 495                   	case CQLValue::CIMObject_type: 
 496                   	  { 
 497                   	    CIMObject objBase;
 498 david    1.1.2.23 	    CIMObject objParm;
 499 david    1.1.2.25 	    _theValue.get(objBase);
 500                   	    x._theValue.get(objParm);
 501 david    1.1.2.23 	    
 502 david    1.1.2.25 	    return _compareObjects(objBase,objParm);
 503 david    1.1.2.23 	  }
 504                   	  break;
 505                   	  
 506                   	default:
 507 david    1.1.2.25 	MessageLoaderParms mload(String("CQL.CQLValueRep.CONSTRUCTOR_FAILURE"),
 508                   				 String("Undefined case in constructor."));
 509                   	throw CQLRuntimeException(mload);
 510 david    1.1.2.23 	  break;
 511                   	}
 512                         return false;
 513                       }
 514 david    1.1.2.25   PEG_METHOD_EXIT();
 515 david    1.1.2.1  }
 516 david    1.1.2.23   
 517 david    1.1.2.1  Boolean CQLValueRep::operator!=(const CQLValueRep& x)
 518                   {
 519 david    1.1.2.18   return !(this->operator==(x));
 520 david    1.1.2.1  }
 521                   
 522                   
 523                   Boolean CQLValueRep::operator<=(const CQLValueRep& x)
 524 david    1.1.2.23 {   
 525 david    1.1.2.18   if (this->operator<(x) || this->operator==(x))
 526                       {
 527                         return true;
 528                       }
 529                     
 530                     return false;
 531 david    1.1.2.1  }
 532                   
 533                   
 534                   Boolean CQLValueRep::operator>=(const CQLValueRep& x)
 535                   {
 536 david    1.1.2.18   _validate(x);
 537                      
 538 lucier   1.1.2.13    return !(this->operator<(x));  
 539 david    1.1.2.1  }
 540                   
 541                   
 542                   Boolean CQLValueRep::operator<(const CQLValueRep& x)
 543                   {
 544 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL, "CQLValueRep::operator<");
 545                   
 546 david    1.1.2.24   Uint64 tmpU64;
 547                     Sint64 tmpS64;
 548                     Real64 tmpR64;
 549                     
 550                     switch(_valueType)
 551                       {
 552                       case CQLValue::Null_type:
 553                         {
 554                   	return false;
 555                         }
 556                         break;
 557 david    1.1.2.23       
 558 david    1.1.2.24     case CQLValue::Sint64_type:
 559                         {
 560                   	_theValue.get(tmpS64);
 561                   	if(x._valueType == CQLValue::Sint64_type)
 562 david    1.1.2.18 	  {
 563 david    1.1.2.24 	    Sint64 right;
 564                   	    x._theValue.get(right);
 565                   	    
 566                   	    return tmpS64 < right;
 567 david    1.1.2.18 	  }
 568 david    1.1.2.24 	else if(x._valueType == CQLValue::Uint64_type)
 569                   	  {
 570                   	    x._theValue.get(tmpU64);
 571                   	    
 572                   	    if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 573                   	      {
 574                   		return true;
 575                   	      }
 576                   	    else
 577                   	      {
 578                   		return tmpS64 < (Sint64)tmpU64;
 579                   	      }
 580                   	  }
 581                   	else 
 582                   	  {
 583                   	    x._theValue.get(tmpR64);
 584                   	    
 585                   	    return tmpS64 < tmpR64;
 586                   	  }
 587                   	break;
 588                         }
 589 david    1.1.2.24     case CQLValue::Uint64_type:
 590                         {
 591                   	_theValue.get(tmpU64);
 592                   	if(x._valueType == CQLValue::Uint64_type)
 593                   	  {
 594                   	    Uint64 right;
 595                   	    x._theValue.get(right);
 596                   	    
 597                   	    return tmpU64 < right;
 598                   	  }
 599                   	else if(x._valueType == CQLValue::Sint64_type)
 600                   	  {
 601                   	    x._theValue.get(tmpS64);
 602                   	    
 603                   	    if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 604                   	      {
 605                   		return false;
 606                   	      }
 607                   	    else
 608                   	      {
 609                   		return (Sint64)tmpU64 < tmpS64;
 610 david    1.1.2.24 	      }
 611                   	  }
 612                   	else 
 613                   	  {
 614                   	    x._theValue.get(tmpR64);
 615                   	    if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 616                   	      {
 617                   		return false;
 618                   	      }
 619 david    1.1.2.23 	   else
 620                   	     {
 621                   	       return (Sint64)tmpU64 < tmpR64;
 622                   	     }
 623 david    1.1.2.24 	  }
 624                   	break;
 625                         }
 626                       case CQLValue::Real_type:
 627                         {
 628                   	_theValue.get(tmpR64);
 629                   	if(x._valueType == CQLValue::Real_type)
 630                   	  {
 631                   	    Real64 right;
 632                   	    x._theValue.get(right);
 633 david    1.1.2.23 	   
 634 david    1.1.2.24 	    return tmpR64 < right;
 635                   	  }
 636                   	else if(x._valueType == CQLValue::Uint64_type)
 637 david    1.1.2.23 	  {
 638 david    1.1.2.24 	    x._theValue.get(tmpU64);
 639                   	    
 640                   	    if(tmpU64 > (Uint64)PEGASUS_SINT64_MIN)
 641                   	      {
 642                   		return true;
 643                   	      }
 644                   	    else
 645                   	      {
 646                   		return tmpR64 < (Sint64)tmpU64;
 647                   	      }
 648                   	  }
 649                   	else 
 650                   	  {
 651                   	    x._theValue.get(tmpS64);
 652                   	    
 653                   	    return tmpR64 < tmpS64;
 654                   	  }
 655 david    1.1.2.23 	break;
 656 david    1.1.2.24       }
 657                       case CQLValue::String_type:
 658                         {
 659                   	String tmpS1;
 660                   	String tmpS2;
 661                   	_theValue.get(tmpS1);
 662                   	x._theValue.get(tmpS2);
 663                   	return tmpS1 < tmpS2;
 664                         }
 665                         break;
 666                       case CQLValue::CIMDateTime_type:  
 667                         {
 668                   	CIMDateTime tmpS1;
 669                   	CIMDateTime tmpS2;
 670                   	_theValue.get(tmpS1);
 671                   	x._theValue.get(tmpS2);
 672                   	return tmpS1 < tmpS2;
 673                         }
 674                         break;
 675 david    1.1.2.25 
 676 david    1.1.2.24     default:
 677 david    1.1.2.25 	MessageLoaderParms mload(String("CQL.CQLValueRep.CONSTRUCTOR_FAILURE"),
 678                   				 String("Undefined case in constructor."));
 679                   	throw CQLRuntimeException(mload);
 680 david    1.1.2.24       break;
 681                       }
 682 david    1.1.2.25   PEG_METHOD_EXIT();
 683 david    1.1.2.24   return false;
 684 david    1.1.2.1  }
 685                   
 686                   
 687                   Boolean CQLValueRep::operator>(const CQLValueRep& x)
 688                   {
 689 david    1.1.2.18    _validate(x);
 690                     
 691 lucier   1.1.2.13    if (this->operator<(x) || this->operator==(x))
 692 david    1.1.2.18      {
 693                          return false;
 694                        }  
 695 lucier   1.1.2.13    return true;
 696 david    1.1.2.1  }
 697                   
 698 david    1.1.2.17 
 699 david    1.1.2.1  CQLValueRep CQLValueRep::operator+(const CQLValueRep x)
 700                   {
 701 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::operator+");
 702 david    1.1.2.18    _validate(x); 
 703 david    1.1.2.6  
 704 david    1.1.2.1     switch(_valueType)
 705 david    1.1.2.25      {
 706 david    1.1.2.18      case CQLValue::String_type:
 707 david    1.1.2.23        {
 708                   	 String tmpS1;
 709                   	 String tmpS2;
 710                   	 _theValue.get(tmpS1);
 711                   	 x._theValue.get(tmpS2);
 712                   	 return CQLValueRep(tmpS1 + tmpS2);
 713                          }
 714 david    1.1.2.18        break;
 715                          
 716                        default:
 717 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.CONSTRUCTOR_FAILURE"),
 718                   				String("Undefined case in constructor."));
 719                          throw CQLRuntimeException(mload);
 720 david    1.1.2.18        break;
 721                        }
 722 david    1.1.2.1  
 723 david    1.1.2.25    PEG_METHOD_EXIT();
 724 david    1.1.2.1     return x;
 725                   }
 726                   
 727 david    1.1.2.15 CQLValue::CQLValueType CQLValueRep::getValueType()
 728 david    1.1.2.1  {
 729                      return _valueType;
 730                   }
 731                   
 732                   
 733                   void CQLValueRep::setNull()
 734                   {
 735 david    1.1.2.15    _valueType = CQLValue::Null_type;
 736 david    1.1.2.1     _isResolved = true;
 737                   }
 738                   
 739                   
 740                   Boolean CQLValueRep::isResolved()
 741                   {
 742                      return _isResolved;
 743                   }
 744                   
 745                   
 746                   Boolean CQLValueRep::isNull()
 747                   {
 748 david    1.1.2.15    if(_valueType == CQLValue::Null_type)
 749 david    1.1.2.1     {
 750                         return true;
 751                      }
 752                      return false;
 753                   }
 754                   
 755                   
 756 david    1.1.2.18 Boolean CQLValueRep::isa(const CQLChainedIdentifier& inID,QueryContext& QueryCtx)
 757 david    1.1.2.1  {
 758 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::isa()");
 759 david    1.1.2.1     if(!_isResolved || 
 760 david    1.1.2.23       (_valueType != CQLValue::CIMObject_type))
 761 david    1.1.2.18      {
 762 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.ISA_TYPE_MISMATCH"),
 763                   				String("The type is not an object."));
 764                          throw CQLRuntimeException(mload);
 765 david    1.1.2.18      }
 766 david    1.1.2.1     
 767 david    1.1.2.18    CIMName className;
 768 david    1.1.2.23    CIMObject obj;
 769 david    1.1.2.1  
 770 david    1.1.2.25    _theValue.get(obj);
 771 david    1.1.2.23 
 772                      className = obj.getClassName();
 773 david    1.1.2.1  
 774 david    1.1.2.18    Array<CIMName> cimNames = QueryCtx.enumerateClassNames(inID[0].getName());
 775 david    1.1.2.1  
 776 david    1.1.2.18    for(Uint32 i = 0; i < cimNames.size() ; ++i)
 777                        {
 778                          if(cimNames[i] == className)
 779                   	 {
 780 david    1.1.2.25 	   PEG_METHOD_EXIT();
 781 david    1.1.2.18 	   return true;
 782                   	 }
 783                        }
 784 david    1.1.2.25    PEG_METHOD_EXIT();
 785 david    1.1.2.1     return false;
 786                   }
 787                   
 788                   
 789                   Boolean CQLValueRep::like(const CQLValueRep& inVal)
 790                   {
 791 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::like()");
 792 david    1.1.2.15    if( _valueType != CQLValue::String_type ||
 793                         inVal._valueType != CQLValue::String_type)
 794 david    1.1.2.1     {
 795 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.LIKE_TYPE_MISMATCH"),
 796                   				String("The type is not a string."));
 797                          throw CQLRuntimeException(mload);
 798 david    1.1.2.1     }
 799 david    1.1.2.20    
 800 david    1.1.2.23    String leftside;
 801                      _theValue.get(leftside);
 802                   
 803                      String rightside;
 804                      inVal._theValue.get(rightside);
 805 dj.gorey 1.1.2.21    
 806                      CQLRegularExpression re;
 807 david    1.1.2.25 
 808                      PEG_METHOD_EXIT();
 809 dj.gorey 1.1.2.21    return re.match(leftside,rightside);
 810 david    1.1.2.23 
 811 david    1.1.2.1  }
 812 david    1.1.2.19 
 813 david    1.1.2.1  CQLChainedIdentifier CQLValueRep::getChainedIdentifier()const
 814                   {
 815                      return _CQLChainId;
 816                   }
 817                   
 818                   Uint64 CQLValueRep::getUint()const
 819                   {
 820 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getUint()");
 821 david    1.1.2.15    if(_valueType != CQLValue::Uint64_type)
 822 david    1.1.2.1     {
 823 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 824                   				String("The type is not correct for get operation."));
 825                          throw CQLRuntimeException(mload);
 826 david    1.1.2.1     }
 827 david    1.1.2.23    Uint64 tmp;
 828                      _theValue.get(tmp);
 829 david    1.1.2.25 
 830                      PEG_METHOD_EXIT();
 831 david    1.1.2.23    return tmp;
 832 david    1.1.2.1  }
 833                   
 834                   Boolean CQLValueRep::getBool()const
 835                   {
 836 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getBool()");
 837 david    1.1.2.15    if(_valueType != CQLValue::Boolean_type)
 838 david    1.1.2.1     {
 839 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 840                   				String("The type is not correct for get operation."));
 841                          throw CQLRuntimeException(mload);
 842 david    1.1.2.1     }
 843 david    1.1.2.23    Boolean tmp;
 844                      _theValue.get(tmp);
 845 david    1.1.2.25 
 846                      PEG_METHOD_EXIT();
 847 david    1.1.2.23    return tmp;
 848 david    1.1.2.1  }
 849                   
 850                   Sint64 CQLValueRep::getSint()const
 851                   {
 852 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getSint()");
 853                   
 854 david    1.1.2.15    if(_valueType != CQLValue::Sint64_type)
 855 david    1.1.2.1     {
 856 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 857                   				String("The type is not correct for get operation."));
 858                          throw CQLRuntimeException(mload);
 859 david    1.1.2.1     }
 860 david    1.1.2.23    Sint64 tmp;
 861                      _theValue.get(tmp);
 862 david    1.1.2.25 
 863                      PEG_METHOD_EXIT();
 864 david    1.1.2.23    return tmp;
 865 david    1.1.2.1  }
 866                   
 867                   Real64 CQLValueRep::getReal()const
 868                   {
 869 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getReal()");
 870 david    1.1.2.15    if(_valueType != CQLValue::Real_type)
 871 david    1.1.2.1     {
 872 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 873                   				String("The type is not correct for get operation."));
 874                          throw CQLRuntimeException(mload);
 875 david    1.1.2.1     }
 876 david    1.1.2.23    Real64 tmp;
 877                      _theValue.get(tmp);
 878 david    1.1.2.25    PEG_METHOD_EXIT();
 879 david    1.1.2.23    return tmp;
 880 david    1.1.2.1  }
 881                   
 882                   String CQLValueRep::getString()const
 883                   {
 884 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getString()");
 885 david    1.1.2.15    if(_valueType != CQLValue::String_type)
 886 david    1.1.2.1     {
 887 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 888                   				String("The type is not correct for get operation."));
 889                          throw CQLRuntimeException(mload);
 890 david    1.1.2.1     }
 891 david    1.1.2.23    String tmp;
 892                      _theValue.get(tmp);
 893 david    1.1.2.25    PEG_METHOD_EXIT();
 894 david    1.1.2.23    return tmp;
 895 david    1.1.2.1  }
 896                   
 897                   CIMDateTime CQLValueRep::getDateTime()const
 898                   {
 899 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getDateTime()");
 900 david    1.1.2.15    if(_valueType != CQLValue::CIMDateTime_type)
 901 david    1.1.2.1     {
 902 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 903                   				String("The type is not correct for get operation."));
 904                          throw CQLRuntimeException(mload);
 905 david    1.1.2.1     }
 906 david    1.1.2.23    CIMDateTime tmp;
 907                      _theValue.get(tmp);
 908 david    1.1.2.25    PEG_METHOD_EXIT();
 909 david    1.1.2.23    return tmp;
 910 david    1.1.2.1  }
 911                   
 912                   CIMObjectPath CQLValueRep::getReference()const
 913                   {
 914 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getReference()");
 915                   
 916 david    1.1.2.15    if(_valueType != CQLValue::CIMReference_type)
 917 david    1.1.2.1     {
 918 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 919                   				String("The type is not correct for get operation."));
 920                          throw CQLRuntimeException(mload);
 921 david    1.1.2.1     }
 922 david    1.1.2.23    CIMObjectPath tmp;
 923                      _theValue.get(tmp);
 924 david    1.1.2.25 
 925                      PEG_METHOD_EXIT();
 926 david    1.1.2.23    return tmp;
 927 david    1.1.2.1  }
 928                   
 929 david    1.1.2.23 CIMObject CQLValueRep::getObject()const
 930 david    1.1.2.1  {
 931 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::getObject()");
 932 david    1.1.2.23    if(_valueType != CQLValue::CIMObject_type)
 933 david    1.1.2.1     {
 934 david    1.1.2.25        MessageLoaderParms mload(String("CQL.CQLValueRep.TYPE_MISMATCH"),
 935                   				String("The type is not correct for get operation."));
 936                          throw CQLRuntimeException(mload);
 937 david    1.1.2.1     }
 938 david    1.1.2.23    CIMObject tmp;
 939 david    1.1.2.25    _theValue.get(tmp);
 940                      PEG_METHOD_EXIT();
 941 david    1.1.2.23    return tmp.clone();
 942 david    1.1.2.1  }
 943                   
 944                   String CQLValueRep::toString()const
 945                   {
 946 david    1.1.2.23   if(_valueType == CQLValue::CQLIdentifier_type)
 947                       {
 948                         return _CQLChainId.toString();
 949                       }
 950                     else
 951                       {
 952                         return _theValue.toString();
 953                       }
 954 david    1.1.2.1  }
 955                   
 956                   
 957                   
 958 david    1.1.2.18 void CQLValueRep::_validate(const CQLValueRep& x)
 959 david    1.1.2.1  {
 960 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::_validate()");
 961 david    1.1.2.1     switch(_valueType)
 962                      {
 963 david    1.1.2.15       case CQLValue::Boolean_type:
 964                            if(x._valueType != CQLValue::Boolean_type)
 965 david    1.1.2.1           {
 966 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
 967                   				    String("Invalid types for operation."));
 968                   	   throw CQLRuntimeException(mload);
 969 david    1.1.2.1           }
 970                            break;
 971 david    1.1.2.15       case CQLValue::Sint64_type:
 972                         case CQLValue::Uint64_type:
 973                         case CQLValue::Real_type:
 974                            if(x._valueType != CQLValue::Sint64_type &&
 975                               x._valueType != CQLValue::Uint64_type &&
 976                               x._valueType != CQLValue::Real_type)
 977 david    1.1.2.1           {
 978 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
 979                   				    String("Invalid types for operation."));
 980                   	   throw CQLRuntimeException(mload);
 981 david    1.1.2.1           }
 982                            break;
 983 david    1.1.2.15       case CQLValue::String_type:
 984                            if(x._valueType != CQLValue::String_type)
 985 david    1.1.2.1           {
 986 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
 987                   				    String("Invalid types for operation."));
 988                   	   throw CQLRuntimeException(mload);
 989 david    1.1.2.1           }
 990                            break;
 991 david    1.1.2.15       case CQLValue::CIMDateTime_type:
 992                            if(x._valueType != CQLValue::CIMDateTime_type)
 993 david    1.1.2.1           {
 994 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
 995                   				    String("Invalid types for operation."));
 996                   	   throw CQLRuntimeException(mload);
 997 david    1.1.2.1           }
 998                            break;
 999 david    1.1.2.15       case CQLValue::CIMReference_type:
1000                            if(x._valueType != CQLValue::CIMReference_type)
1001 david    1.1.2.1           {
1002 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
1003                   				    String("Invalid types for operation."));
1004                   	   throw CQLRuntimeException(mload);
1005 david    1.1.2.1           }
1006                            break;
1007 david    1.1.2.23       case CQLValue::CIMObject_type:
1008                            if(x._valueType != CQLValue::CIMObject_type)
1009 david    1.1.2.1           {
1010 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
1011                   				    String("Invalid types for operation."));
1012                   	   throw CQLRuntimeException(mload);
1013 david    1.1.2.1           }
1014                            break;
1015 david    1.1.2.15       case CQLValue::CQLIdentifier_type:
1016                            if(x._valueType != CQLValue::CQLIdentifier_type)
1017 david    1.1.2.1           {
1018 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
1019                   				    String("Invalid types for operation."));
1020                   	   throw CQLRuntimeException(mload);
1021 david    1.1.2.1           }
1022                            break;
1023                   
1024                         default:
1025 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.OP_TYPE_MISMATCH"),
1026                   				    String("Invalid types for operation."));
1027                   	   throw CQLRuntimeException(mload);
1028 david    1.1.2.1           break;
1029                      }
1030 david    1.1.2.25    PEG_METHOD_EXIT();
1031 david    1.1.2.18    return;
1032 david    1.1.2.1  }
1033                   
1034 david    1.1.2.23 void CQLValueRep::_setValue(CIMValue cv,Sint64 index)
1035 david    1.1.2.1  {
1036 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::_setValue()");
1037 david    1.1.2.23   CIMValue tmp;
1038 david    1.1.2.24   if(cv.isArray())
1039 david    1.1.2.23     {
1040 david    1.1.2.1        switch(cv.getType())
1041 david    1.1.2.23 	{
1042                   	case CIMTYPE_BOOLEAN:
1043                   	  {
1044 david    1.1.2.24 	    if(index == -1)
1045                   	      {
1046                   		_theValue = cv;
1047                   	      }
1048                   	    else
1049                   	      {
1050                   		Array<Boolean> _bool;
1051                   		cv.get(_bool);
1052                   		_theValue.set(_bool[index]);
1053                   	      }
1054                   
1055                   	    _valueType = CQLValue::Boolean_type;
1056 david    1.1.2.1              break;
1057 david    1.1.2.23 	  }
1058                   	case CIMTYPE_UINT8:
1059                   	  {
1060 david    1.1.2.24 	    Array<Uint8> _uint;
1061                   	    cv.get(_uint);
1062                   
1063                   	    if(index == -1)
1064                   	      {
1065                   		Array<Uint64> _uint64;
1066                   		for(Uint32 i = 0; i < _uint.size(); ++i)
1067                   		  {
1068                   		    _uint64.append((Uint64)_uint[i]);
1069                   		  }
1070                   		_theValue = CIMValue(_uint64);
1071                   	      }
1072                   	    else
1073                   	      {
1074                   		_theValue.set((Uint64)_uint[index]);
1075                   	      }
1076 david    1.1.2.15             _valueType = CQLValue::Uint64_type;
1077 david    1.1.2.1              break;
1078 david    1.1.2.23 	  }
1079                   	case CIMTYPE_UINT16:
1080                   	  {
1081 david    1.1.2.24 	    Array<Uint16> _uint;
1082                   	    cv.get(_uint);
1083                   
1084                   	    if(index == -1)
1085                   	      {
1086                   		Array<Uint64> _uint64;
1087                   		for(Uint32 i = 0; i < _uint.size(); ++i)
1088                   		  {
1089                   		    _uint64.append((Uint64)_uint[i]);
1090                   		  }
1091                   		_theValue = CIMValue(_uint64);
1092                   	      }
1093                   	    else
1094                   	      {
1095                   		_theValue.set((Uint64)_uint[index]);
1096                   	      }
1097 david    1.1.2.15             _valueType = CQLValue::Uint64_type;
1098 david    1.1.2.1              break;
1099 david    1.1.2.23 	  }
1100                   	case CIMTYPE_UINT32:
1101                   	  {
1102 david    1.1.2.24 	    Array<Uint32> _uint;
1103                   	    cv.get(_uint);
1104                   
1105                   	    if(index == -1)
1106                   	      {
1107                   		Array<Uint64> _uint64;
1108                   		for(Uint32 i = 0; i < _uint.size(); ++i)
1109                   		  {
1110                   		    _uint64.append((Uint64)_uint[i]);
1111                   		  }
1112                   		_theValue = CIMValue(_uint64);
1113                   	      }
1114                   	    else
1115                   	      {
1116                   		_theValue.set((Uint64)_uint[index]);
1117                   	      }
1118 david    1.1.2.15             _valueType = CQLValue::Uint64_type;
1119 david    1.1.2.1              break;
1120 david    1.1.2.23 	  }
1121                   	case CIMTYPE_UINT64:
1122                   	  {
1123 david    1.1.2.24 	    if(index == -1)
1124                   	      {
1125                   		_theValue = cv;
1126                   	      }
1127                   	    else
1128                   	      {
1129                   		Array<Uint64> _uint;
1130                   		cv.get(_uint);
1131                   		_theValue.set((Uint64)_uint[index]);
1132                   	      }
1133 david    1.1.2.15             _valueType = CQLValue::Uint64_type;
1134 david    1.1.2.1              break;
1135 david    1.1.2.23 	  }
1136                   	case CIMTYPE_SINT8:
1137                   	  {
1138                   	    Array<Sint8> _sint;
1139                   	    cv.get(_sint);
1140 david    1.1.2.24 
1141                   	    if(index == -1)
1142                   	      {
1143                   		Array<Sint64> _sint64;
1144                   		for(Uint32 i = 0; i < _sint.size(); ++i)
1145                   		  {
1146                   		    _sint64.append((Sint64)_sint[i]);
1147                   		  }
1148                   		_theValue = CIMValue(_sint64);
1149                   	      }
1150                   	    else
1151                   	      {
1152                   		_theValue.set((Sint64)_sint[index]);
1153                   	      }
1154 david    1.1.2.23 	    _valueType = CQLValue::Sint64_type;
1155                   	    break;
1156                   	  }
1157                   	case CIMTYPE_SINT16:
1158                   	  {
1159                   	    Array<Sint16> _sint;
1160                   	    cv.get(_sint);
1161 david    1.1.2.24 
1162                   	    if(index == -1)
1163                   	      {
1164                   		Array<Sint64> _sint64;
1165                   		for(Uint32 i = 0; i < _sint.size(); ++i)
1166                   		  {
1167                   		    _sint64.append((Sint64)_sint[i]);
1168                   		  }
1169                   		_theValue = CIMValue(_sint64);
1170                   	      }
1171                   	    else
1172                   	      {
1173                   		_theValue.set((Sint64)_sint[index]);
1174                   	      }
1175 david    1.1.2.23 	    _valueType = CQLValue::Sint64_type;
1176                   	    break;
1177                   	  }
1178                   	case CIMTYPE_SINT32:
1179                   	  {
1180 david    1.1.2.24 	    Array<Sint32> _sint;
1181                   	    cv.get(_sint);
1182                   
1183                   	    if(index == -1)
1184                   	      {
1185                   		Array<Sint64> _sint64;
1186                   		for(Uint32 i = 0; i < _sint.size(); ++i)
1187                   		  {
1188                   		    _sint64.append((Sint64)_sint[i]);
1189                   		  }
1190                   		_theValue = CIMValue(_sint64);
1191                   	      }
1192                   	    else
1193                   	      {
1194                   		_theValue.set((Sint64)_sint[index]);
1195                   	      }
1196 david    1.1.2.15             _valueType = CQLValue::Sint64_type;
1197 david    1.1.2.1              break;
1198 david    1.1.2.23 	  }
1199                   	case CIMTYPE_SINT64:
1200                   	  {
1201 david    1.1.2.24 	    if(index == -1)
1202                   	      {
1203                   		_theValue = cv;
1204                   	      }
1205                   	    else
1206                   	      {
1207                   		Array<Sint64> _sint;
1208                   		cv.get(_sint);
1209                   		_theValue.set((Sint64)_sint[index]);
1210                   	      }
1211 david    1.1.2.15             _valueType = CQLValue::Sint64_type;
1212 david    1.1.2.1              break;
1213 david    1.1.2.23 	  }
1214                   	  
1215                   	case CIMTYPE_REAL32:
1216                   	  {
1217 david    1.1.2.24 	    Array<Real32> _real;
1218                   	    cv.get(_real);
1219                   
1220                   	    if(index == -1)
1221                   	      {
1222                   		Array<Real64> _real64;
1223                   		for(Uint32 i = 0; i < _real.size(); ++i)
1224                   		  {
1225                   		    _real64.append((Real64)_real[i]);
1226                   		  }
1227                   		_theValue = CIMValue(_real64);
1228                   	      }
1229                   	    else
1230                   	      {
1231                   		_theValue.set((Real64)_real[index]);
1232                   	      }
1233 david    1.1.2.15             _valueType = CQLValue::Real_type;
1234 david    1.1.2.1              break;
1235 david    1.1.2.23 	  }
1236                   	case CIMTYPE_REAL64:
1237                   	  {
1238 david    1.1.2.24 	    if(index == -1)
1239                   	      {
1240                   		_theValue = cv;
1241                   	      }
1242                   	    else
1243                   	      {
1244                   		Array<Real64> _real;
1245                   		cv.get(_real);
1246                   		_theValue.set((Real64)_real[index]);
1247                   	      }
1248 david    1.1.2.15             _valueType = CQLValue::Real_type;
1249 david    1.1.2.1              break;
1250 david    1.1.2.23 	  }   
1251                   	case CIMTYPE_CHAR16:
1252                   	  {
1253 david    1.1.2.24 	    Array<Char16> _str16;
1254                   	    cv.get(_str16);
1255                   
1256                   	    if(index == -1)
1257                   	      {
1258                   		Array<String> _str;
1259                   		for(Uint32 i = 0; i < _str16.size(); ++i)
1260                   		  {
1261                   		    _str.append(String(&_str16[i]));
1262                   		  }
1263                   		_theValue = CIMValue(_str);
1264                   	      }
1265                   	    else
1266                   	      {
1267                   		_theValue.set(String(&_str16[index]));
1268                   	      }
1269                   	    _valueType = CQLValue::String_type;
1270 david    1.1.2.1              break;
1271 david    1.1.2.23 	  }
1272                   	case CIMTYPE_STRING:
1273                   	  {
1274 david    1.1.2.24 	    if(index == -1)
1275                   	      {
1276                   		_theValue = cv;
1277                   	      }
1278                   	    else
1279                   	      {
1280                   		Array<String> _str;
1281                   		cv.get(_str);
1282                   		_theValue.set(_str[index]);
1283                   	      }
1284 david    1.1.2.15             _valueType = CQLValue::String_type;
1285 david    1.1.2.1              break;
1286 david    1.1.2.23 	  }  
1287                   	case CIMTYPE_DATETIME:
1288                   	  {
1289 david    1.1.2.24 	    if(index == -1)
1290                   	      {
1291                   		_theValue = cv;
1292                   	      }
1293                   	    else
1294                   	      {
1295                   		Array<CIMDateTime> _date;
1296                   		cv.get(_date);
1297                   		_theValue.set(_date[index]);
1298                   	      }
1299 david    1.1.2.15             _valueType = CQLValue::CIMDateTime_type;
1300 david    1.1.2.1              break;
1301 david    1.1.2.23 	  }
1302                   	case CIMTYPE_REFERENCE:
1303                   	  {
1304 david    1.1.2.24 	    if(index == -1)
1305                   	      {
1306                   		_theValue = cv;
1307                   	      }
1308                   	    else
1309                   	      {
1310                   		Array<CIMObjectPath> _path;
1311                   		cv.get(_path);
1312                   		_theValue.set(_path[index]);
1313                   	      }
1314 david    1.1.2.15             _valueType = CQLValue::CIMReference_type;
1315 david    1.1.2.1              break;
1316 david    1.1.2.23 	  }   
1317                   	case CIMTYPE_EMBEDDED:
1318                   	  {
1319 david    1.1.2.24 	    if(index == -1)
1320                   	      {
1321                   		_theValue = cv;
1322                   	      }
1323                   	    else
1324                   	      {
1325                   		Array<CIMObject> _obj;
1326 david    1.1.2.25 		cv.get(_obj);
1327                   		_theValue.set(_obj[index]);
1328 david    1.1.2.24 	      }
1329 david    1.1.2.23             _valueType = CQLValue::CIMObject_type;
1330                               break;
1331                   	  }   
1332                   	default:
1333 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.SET_VALUE"),
1334                   				    String("Unable to set internal object."));
1335                   	   throw CQLRuntimeException(mload);
1336 david    1.1.2.23 	} // switch statement 
1337                       }
1338                     else
1339                       {
1340 david    1.1.2.1        switch(cv.getType())
1341 david    1.1.2.23 	{
1342                   	case CIMTYPE_BOOLEAN:
1343                   	  {
1344                   	    _theValue = cv;
1345 david    1.1.2.15             _valueType = CQLValue::Boolean_type;
1346 david    1.1.2.1              break;
1347 david    1.1.2.23 	  }
1348                   	case CIMTYPE_UINT8:
1349                   	  {
1350                   	    Uint8 _tmp;
1351                   	    cv.get(_tmp);
1352                   	    _theValue = CIMValue((Uint64)_tmp);
1353                   	    _valueType = CQLValue::Uint64_type;
1354                   	    break;
1355                   	  }
1356                   	case CIMTYPE_UINT16:
1357                   	  {
1358                   	    Uint16 _tmp;
1359                   	    cv.get(_tmp);
1360                   	    _theValue = CIMValue((Uint64)_tmp);
1361                   	    _valueType = CQLValue::Uint64_type;
1362                   	    break;
1363                   	  }
1364                   	case CIMTYPE_UINT32:
1365                   	  {
1366                   	    Uint32 _tmp;
1367                   	    cv.get(_tmp);
1368 david    1.1.2.23 	    _theValue = CIMValue((Uint64)_tmp);
1369                   	    _valueType = CQLValue::Uint64_type;
1370                   	    break;
1371                   	  }
1372                   	case CIMTYPE_UINT64:
1373                   	  {
1374                   	    Uint64 _tmp;
1375                   	    cv.get(_tmp);
1376                   	    _theValue = CIMValue((Uint64)_tmp);
1377                   	    _valueType = CQLValue::Uint64_type;
1378                   	    break;
1379                   	  }
1380                   	case CIMTYPE_SINT8:
1381                   	  {
1382                   	    Sint8 _tmp;
1383                   	    cv.get(_tmp);
1384                   	    _theValue = CIMValue((Sint64)_tmp);
1385                   	    _valueType = CQLValue::Sint64_type;
1386                   	    break;
1387                   	  }
1388                   	case CIMTYPE_SINT16:
1389 david    1.1.2.23 	  {
1390                   	    Sint16 _tmp;
1391                   	    cv.get(_tmp);
1392                   	    _theValue = CIMValue((Sint64)_tmp);
1393                   	    _valueType = CQLValue::Sint64_type;
1394                   	    break;
1395                   	  }
1396                   	case CIMTYPE_SINT32:
1397                   	  {
1398                   	    Sint32 _tmp;
1399                   	    cv.get(_tmp);
1400                   	    _theValue = CIMValue((Sint64)_tmp);
1401                   	    _valueType = CQLValue::Sint64_type;
1402                   	    break;
1403                   	  }
1404                   	case CIMTYPE_SINT64:
1405                   	  {
1406                   	    Sint64 _tmp;
1407                   	    cv.get(_tmp);
1408                   	    _theValue = CIMValue((Sint64)_tmp);
1409                   	    _valueType = CQLValue::Sint64_type;
1410 david    1.1.2.23 	    break;
1411                   	  }
1412                   	case CIMTYPE_REAL32:
1413                   	  {
1414                   	    Real64 _tmp;
1415                   	    cv.get(_tmp);
1416                   	    _theValue = CIMValue((Real64)_tmp);
1417                   	    _valueType = CQLValue::Real_type;
1418                   	    break;
1419                   	  }
1420                   	case CIMTYPE_REAL64:
1421                   	  {
1422                   	    Real64 _tmp;
1423                   	    cv.get(_tmp);
1424                   	    _theValue = CIMValue((Real64)_tmp);
1425                   	    _valueType = CQLValue::Real_type;
1426                   	    break;
1427                   	  }   
1428                   	case CIMTYPE_CHAR16:
1429                   	  {
1430                   	    Char16 _tmp;
1431 david    1.1.2.23 	    cv.get(_tmp);
1432                   	    _theValue = CIMValue(String(&_tmp));
1433                   	    _valueType = CQLValue::String_type;
1434                   	    break;
1435                   	  }  
1436                   	case CIMTYPE_STRING:
1437                   	  {
1438                   	    _theValue = cv;
1439                   	    _valueType = CQLValue::String_type;
1440                   	    break;
1441                   	  }   
1442                   	case CIMTYPE_DATETIME:
1443                   	  {
1444                   	    _theValue = cv;
1445                   	    _valueType = CQLValue::CIMDateTime_type;
1446                   	    break;
1447                   	  } 
1448                   	case CIMTYPE_REFERENCE:
1449                   	  {
1450                   	    _theValue = cv;
1451                               _valueType = CQLValue::CIMReference_type;
1452 david    1.1.2.1              break;
1453 david    1.1.2.23 	  }   
1454                   	case CIMTYPE_EMBEDDED:
1455                   	  {
1456                   	    _theValue = cv;
1457                               _valueType = CQLValue::CIMObject_type;
1458 david    1.1.2.1              break;
1459 david    1.1.2.23 	  }   
1460                   	default:
1461 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.SET_VALUE"),
1462                   				    String("Unable to set internal object."));
1463                   	   throw CQLRuntimeException(mload);
1464 david    1.1.2.23 	}
1465 david    1.1.2.1  
1466 david    1.1.2.23     }
1467                   
1468                     _isResolved = true;
1469 david    1.1.2.25 
1470                     PEG_METHOD_EXIT();
1471 david    1.1.2.23   return;
1472 david    1.1.2.1  }
1473                   
1474 david    1.1.2.8  void CQLValueRep::applyContext(QueryContext& _ctx,
1475                                                 CQLChainedIdentifier& inCid)
1476 lucier   1.1.2.13 {
1477 david    1.1.2.8     if(inCid.size() != 0 && _CQLChainId.size() == 1)
1478 david    1.1.2.18      {  
1479                          // If we get here we have a stand alone Symbolic constant.
1480                          // We need to take the chain and create a complete context
1481                          // for the symbolic constant.  We will use the context from
1482                          // inCid to populate the context for chain.
1483 chuck    1.1.2.22        /*
1484 david    1.1.2.18         _CQLChainId[0].setName(inCid[inCid.size()-1].getName());
1485                           _CQLChainId[0].applyScope(inCid[inCid.size()-1].getScope());
1486 chuck    1.1.2.22        */
1487                          
1488                          CQLIdentifier id = _CQLChainId[0];
1489                          id.setName(inCid[inCid.size()-1].getName());
1490                          id.applyScope(inCid[inCid.size()-1].getScope());
1491                   
1492                          CQLChainedIdentifier chainId(id);
1493                   
1494                          for(Sint32 i = inCid.size()-2; i >= 0; --i)
1495                          {
1496                            chainId.prepend(inCid[i]); 
1497                          }
1498                   
1499                          _CQLChainId = chainId;
1500                   
1501                   
1502 david    1.1.2.18 	CIMInstance temp;
1503                   	resolve(temp,_ctx);
1504                        }
1505 david    1.1.2.8     else
1506 david    1.1.2.18      {
1507                          _CQLChainId.applyContext(_ctx); 
1508                        }
1509 chuck    1.1.2.22 
1510                      // Add the chained identifier to the WHERE identifier list.
1511                      // Note: CQLValue's are only used in WHERE processing.
1512                      if (_CQLChainId.size() > 0)
1513                      {
1514                        _ctx.addWhereIdentifier(_CQLChainId);
1515                      }
1516 humberto 1.1.2.2  }
1517                   
1518 david    1.1.2.17 void CQLValueRep::_resolveSymbolicConstant(const QueryContext& inQueryCtx)
1519 david    1.1.2.9  {
1520 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::_resolveSymbolicConstant()");
1521                   
1522 david    1.1.2.9     Array<String> valueMapArray;     // Value Map Qualifier for property
1523                      Array<String> valuesArray;       // Values Qualifier for property
1524                      CIMName className;
1525                      CQLIdentifier lid = _CQLChainId.getLastIdentifier();
1526                      CIMClass QueryClass;
1527                      CIMValue valueMap;               // CIMValue for Value Map Qualifiers
1528                      CIMValue values;                 // CIMValue for Values Qualifiers
1529                      Boolean matchFound = false;      // Indicator for match Qualifier
1530                      Uint32 matchIndex;               // Placeholder for matched Qualifier
1531                   
1532                      if(lid.isScoped())
1533                      {
1534 david    1.1.2.25      className = lid.getScope();
1535 david    1.1.2.9     }
1536                      else
1537                      {
1538 david    1.1.2.25      className = _CQLChainId[0].getName();
1539 david    1.1.2.9     }
1540                   
1541 chuck    1.1.2.22    PEGASUS_STD(cout) << _CQLChainId.toString() << PEGASUS_STD(endl);
1542                   
1543 david    1.1.2.9     QueryClass = inQueryCtx.getClass(className);
1544                   
1545                      Uint32 propertyIndex = 
1546                            QueryClass.findProperty(lid.getName());
1547                   
1548                      if(propertyIndex == PEG_NOT_FOUND)
1549                      {
1550 david    1.1.2.25      MessageLoaderParms mload(String("CQL.CQLValueRep.PROP_NOT_FOUND"),
1551                   			      String("Property $0 not found on class $1."),
1552                   			      lid.getName().getString(),
1553                   			      className.getString());
1554                        throw CQLRuntimeException(mload);
1555 david    1.1.2.9     }
1556                   
1557                      CIMProperty queryPropObj = QueryClass.getProperty(propertyIndex);
1558                   
1559                      // We have a symbolic constant (ex. propName#OK)
1560                      // We need to retrieve the ValueMap and Values Qualifiers for 
1561                      // the property if the exist.
1562                      Uint32 qualIndex = queryPropObj.findQualifier(CIMName("ValueMap"));
1563                   
1564                      if(qualIndex == PEG_NOT_FOUND)
1565                      {
1566                         // This property can not be processed with a symbolic constant.
1567 david    1.1.2.25      MessageLoaderParms mload(String("CQL.CQLValueRep.QUALIFIER_NOT_FOUND"),
1568                   			      String("Qualifier $0 not found on Property $1 in class $2."),
1569                   			      String("ValueMap"),
1570                   			      lid.getName().getString(),
1571                   			      className.getString());
1572                        throw CQLRuntimeException(mload);
1573 david    1.1.2.9     }
1574                   
1575                      valueMap = queryPropObj.getQualifier(qualIndex).getValue();
1576                      qualIndex = queryPropObj.findQualifier(CIMName("Values"));
1577                   
1578                      if(qualIndex == PEG_NOT_FOUND)
1579 david    1.1.2.18      {
1580                          // This property does not have a Values Qualifier,
1581                          // therefore the valueMap must be the list of symbolic constants.
1582                          
1583                          valueMap.get(valueMapArray);
1584                          
1585                          // We will loop through the list of Symbolic constants to 
1586                          // determine if we have a match with the Symbolic constant
1587                          // defined in the CQLIdentifier.
1588                          for(Uint32 i = 0; i < valueMapArray.size(); ++i)
1589                   	 {
1590                   	   if(String::equalNoCase(valueMapArray[i],lid.getSymbolicConstantName()))
1591                   	     {
1592                   	       matchFound = true;
1593                   	       matchIndex = i;
1594                   	       break;
1595                   	     }
1596                   	 }
1597                          if(matchFound == false)
1598                   	 {
1599                   	   // The symbolic constant provided is not valid
1600 david    1.1.2.18 	   // for this property.
1601 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.INVALID_SYMBOLIC_CONSTANT"),
1602                   				    String("Provided symbolic constant $0 is not valid for property $1 in class $2."),
1603                   				    lid.getSymbolicConstantName(),
1604                   				    lid.getName().getString(),
1605                   				    className.getString());
1606                   	   throw CQLRuntimeException(mload);
1607 david    1.1.2.18 	 }
1608                          
1609                          // The symbolic constant defined in the CQLIdentifier is 
1610                          // valid for this property. Now we need to set the value.
1611                          // Set primitive
1612                          _setValue(CIMValue(lid.getSymbolicConstantName()));
1613 david    1.1.2.25 
1614                          PEG_METHOD_EXIT();
1615 david    1.1.2.18        return;
1616                        }
1617 david    1.1.2.9     else
1618 david    1.1.2.18      {
1619                          // The qualifier Values is defined for the property.
1620                          // valueMap must be a list of #'s.
1621                          
1622                          values = queryPropObj.getQualifier(qualIndex).getValue();
1623                          
1624                          valueMap.get(valueMapArray);
1625                          values.get(valuesArray);
1626                          
1627                          // We will loop through the list of Symbolic constants to 
1628                          // determine if we have a match with the Symbolic constant
1629                          // defined in the CQLIdentifier.
1630                          for(Uint32 i = 0; i < valuesArray.size(); ++i)
1631 david    1.1.2.9  	 {
1632 david    1.1.2.18 	   if(String::equalNoCase(valuesArray[i],lid.getSymbolicConstantName()))
1633                   	     {
1634                   	       matchFound = true;
1635                   	       matchIndex = i;
1636                   	       break;
1637                   	     }
1638                   	 }
1639                          if(matchFound == false)
1640                   	 {
1641                   	   // The symbolic constant provided is not valid
1642                   	   // for this property.
1643 david    1.1.2.25 	   MessageLoaderParms mload(String("CQL.CQLValueRep.INVALID_SYMBOLIC_CONSTANT"),
1644                   				    String("Provided symbolic constant $0 is not valid for property $1 in class $2."),
1645                   				    lid.getSymbolicConstantName(),
1646                   				    lid.getName().getString(),
1647                   				    className.getString());
1648                   	   throw CQLRuntimeException(mload); 
1649 david    1.1.2.18 	 }
1650                          
1651                          CString cStr = valueMapArray[matchIndex].getCString();
1652                          char *endP;
1653                          
1654                          // Set Primitive
1655                          _setValue(CIMValue(Uint64(strtoul((const char*)cStr,&endP,10))));
1656 david    1.1.2.25 
1657                          PEG_METHOD_EXIT();
1658 david    1.1.2.18        return;
1659                        }
1660 david    1.1.2.25  
1661 david    1.1.2.18 }
1662 david    1.1.2.9  
1663 david    1.1.2.23 Boolean CQLValueRep::_compareObjects(CIMObject& _in1, CIMObject& _in2)
1664 david    1.1.2.18 {
1665 david    1.1.2.24   if(_in1.isClass() != _in2.isClass())
1666                       {
1667                         return false;
1668                       }
1669                     else if(_in1.isClass())
1670                       { // objects are classes 
1671                         return _in1.identical(_in2);
1672                       }
1673                     else
1674                       { // objects are instances
1675                   
1676                         if(_in1.getPropertyCount() !=
1677                   	 _in2.getPropertyCount())
1678                   	{
1679                   	  return false;
1680                   	}
1681                   
1682                         Array<CIMProperty> prop1;
1683                         Array<CIMProperty> prop2;
1684                         Boolean result;
1685                   
1686 david    1.1.2.24       for(Uint32 i = 0; i < _in1.getPropertyCount(); ++i)
1687                   	{
1688                   	  prop1.append(_in1.getProperty(i));
1689                   	  prop2.append(_in2.getProperty(i));
1690                   	}
1691                   
1692                         for(Uint32 i = 0; i < _in1.getPropertyCount(); ++i)
1693                   	{
1694                   	  result = false;
1695                   
1696                   	  for(Uint32 j = 0; j < _in2.getPropertyCount(); ++j)
1697                   	    {
1698                   	      if(prop1[i].getName() == prop2[j].getName())
1699                   		{
1700 david    1.1.2.25 		  if(CQLValue(prop1[i].getValue()) == CQLValue(prop2[j].getValue()))
1701 david    1.1.2.24 		    {
1702                   		      result = true;
1703                   		      break;
1704                   		    }
1705                   		  else
1706                   		    {
1707                   		      result = false;
1708                   		      break;
1709                   		    }
1710                   		}
1711                   	    }
1712                   	  if(result == false)
1713                   	    {
1714                   	      return false;
1715                   	    }
1716                   	}
1717                       }
1718                     return true;
1719                   }
1720                   
1721                   Boolean CQLValueRep::_compareArray(const CQLValueRep& _in)
1722 david    1.1.2.24 {
1723 david    1.1.2.25   PEG_METHOD_ENTER(TRC_CQL,"CQLValueRep::_compareArray()");
1724 david    1.1.2.24   // Currently pegasus has no concept of different array types( Bagged, Ordered, or Indexed)
1725                     // We will do bag comparisons.
1726                     
1727                     Boolean result;
1728                     Array<Boolean>       _bool1;
1729                     Array<Boolean>       _bool2;
1730                     Array<Uint64>        _uint1;
1731                     Array<Uint64>        _uint2;
1732                     Array<Sint64>        _sint1;
1733                     Array<Sint64>        _sint2;
1734                     Array<Real64>        _real1;
1735                     Array<Real64>        _real2;
1736                     Array<String>        _str1;
1737                     Array<String>        _str2;
1738                     Array<CIMDateTime>   _date1;
1739                     Array<CIMDateTime>   _date2;
1740                     Array<CIMObjectPath> _path1;
1741                     Array<CIMObjectPath> _path2;
1742                     Array<CIMObject>     _obj1;
1743                     Array<CIMObject>     _obj2;
1744                   
1745 david    1.1.2.24   Array<CQLValue>      _cqlVal1;
1746                     Array<CQLValue>      _cqlVal2;
1747                   
1748                     CIMValue _in1 = _theValue;
1749                     CIMValue _in2 = _in._theValue;
1750                   
1751                     String _arrayType1 = _ArrayType;
1752                     String _arrayType2 = _in._ArrayType;
1753                   
1754                     switch(_in1.getType())
1755                       {
1756                       case CIMTYPE_BOOLEAN:
1757                         {
1758                   	_in1.get(_bool1);
1759                   	for(Uint32 i = 0; i < _bool1.size(); ++i)
1760                   	  {
1761                   	    _cqlVal1.append(CQLValue(_bool1[i]));
1762                   	  }
1763                         }
1764                       case CIMTYPE_UINT64:
1765                         {
1766 david    1.1.2.24 	_in1.get(_uint1);
1767                   	for(Uint32 i = 0; i < _uint1.size(); ++i)
1768                   	  {
1769                   	    _cqlVal1.append(CQLValue(_uint1[i]));
1770                   	  }
1771                   	break;
1772                         }
1773                       case CIMTYPE_SINT64:
1774                         {
1775                   	_in1.get(_sint1);
1776                   	for(Uint32 i = 0; i < _sint1.size(); ++i)
1777                   	  {
1778                   	    _cqlVal1.append(CQLValue(_sint1[i]));
1779                   	  }
1780                   	break;
1781                         }
1782                       case CIMTYPE_REAL64:
1783                         {
1784                   	_in1.get(_real1);
1785                   	for(Uint32 i = 0; i < _real1.size(); ++i)
1786                   	  {
1787 david    1.1.2.24 	    _cqlVal1.append(CQLValue(_real1[i]));
1788                   	  }
1789                   	break;
1790                         }   
1791                       case CIMTYPE_STRING:
1792                         {
1793                   	_in1.get(_str1);
1794                   	for(Uint32 i = 0; i < _str1.size(); ++i)
1795                   	  {
1796                   	    _cqlVal1.append(CQLValue(_str1[i]));
1797                   	  }
1798                   	break;
1799                         }  
1800                       case CIMTYPE_DATETIME:
1801                         {
1802                   	_in1.get(_date1);
1803                   	for(Uint32 i = 0; i < _date1.size(); ++i)
1804                   	  {
1805                   	    _cqlVal1.append(CQLValue(_date1[i]));
1806                   	  }
1807                   	break;
1808 david    1.1.2.24       }
1809                       case CIMTYPE_REFERENCE:
1810                         {
1811                   	_in1.get(_path1);
1812                   	for(Uint32 i = 0; i < _path1.size(); ++i)
1813                   	  {
1814                   	    _cqlVal1.append(CQLValue(_path1[i]));
1815                   	  }
1816                   	break;
1817                         }   
1818                       case CIMTYPE_EMBEDDED:
1819                         {
1820 david    1.1.2.25 	_in1.get(_obj1);
1821 david    1.1.2.24 	for(Uint32 i = 0; i < _obj1.size(); ++i)
1822                   	  {
1823                   	    _cqlVal1.append(CQLValue(_obj1[i]));
1824                   	  }
1825                   	break;
1826                         }   
1827                       default:
1828 david    1.1.2.25       MessageLoaderParms mload(String("CQL.CQLValueRep.INVALID_ARRAY_COMPARISON"),
1829                   			       String("Invalid array comparison type."));
1830                         throw CQLRuntimeException(mload); 
1831 david    1.1.2.24     } // switch statement 
1832                     
1833                     switch(_in2.getType())
1834                       {
1835                       case CIMTYPE_BOOLEAN:
1836                         {
1837                   	_in2.get(_bool2);
1838                   	for(Uint32 i = 0; i < _bool2.size(); ++i)
1839                   	  {
1840                   	    _cqlVal2.append(CQLValue(_bool2[i]));
1841                   	  }
1842                         }
1843                       case CIMTYPE_UINT64:
1844                         {
1845                   	_in2.get(_uint2);
1846                   	for(Uint32 i = 0; i < _uint2.size(); ++i)
1847                   	  {
1848                   	    _cqlVal2.append(CQLValue(_uint2[i]));
1849                   	  }
1850                   	break;
1851                         }
1852 david    1.1.2.24     case CIMTYPE_SINT64:
1853                         {
1854                   	_in2.get(_sint2);
1855                   	for(Uint32 i = 0; i < _sint2.size(); ++i)
1856                   	  {
1857                   	    _cqlVal2.append(CQLValue(_sint2[i]));
1858                   	  }
1859                   	break;
1860                         }
1861                       case CIMTYPE_REAL64:
1862                         {
1863                   	_in2.get(_real2);
1864                   	for(Uint32 i = 0; i < _real2.size(); ++i)
1865                   	  {
1866                   	    _cqlVal2.append(CQLValue(_real2[i]));
1867                   	  }
1868                   	break;
1869                         }   
1870                       case CIMTYPE_STRING:
1871                         {
1872                   	_in2.get(_str2);
1873 david    1.1.2.24 	for(Uint32 i = 0; i < _str2.size(); ++i)
1874                   	  {
1875                   	    _cqlVal2.append(CQLValue(_str2[i]));
1876                   	  }
1877                   	break;
1878                         }  
1879                       case CIMTYPE_DATETIME:
1880                         {
1881                   	_in2.get(_date2);
1882                   	for(Uint32 i = 0; i < _date2.size(); ++i)
1883                   	  {
1884                   	    _cqlVal2.append(CQLValue(_date2[i]));
1885                   	  }
1886                   	break;
1887                         }
1888                       case CIMTYPE_REFERENCE:
1889                         {
1890                   	_in2.get(_path2);
1891                   	for(Uint32 i = 0; i < _path2.size(); ++i)
1892                   	  {
1893                   	    _cqlVal2.append(CQLValue(_path2[i]));
1894 david    1.1.2.24 	  }
1895                   	break;
1896                         }   
1897                       case CIMTYPE_EMBEDDED:
1898                         {
1899 david    1.1.2.25 	_in2.get(_obj2);
1900 david    1.1.2.24 	for(Uint32 i = 0; i < _obj2.size(); ++i)
1901                   	  {
1902                   	    _cqlVal2.append(CQLValue(_obj2[i]));
1903                   	  }
1904                   	break;
1905                         }   
1906                       default:
1907 david    1.1.2.25       MessageLoaderParms mload(String("CQL.CQLValueRep.INVALID_ARRAY_COMPARISON"),
1908                   			       String("Invalid array comparison type."));
1909                         throw CQLRuntimeException(mload); 
1910 david    1.1.2.24     } // switch statement 
1911                   
1912                     if((_arrayType1 == String("Indexed") ||
1913                         _arrayType1 == String("Ordered")) &&
1914                        (_arrayType2 == String("Indexed") ||
1915                         _arrayType2 == String("Ordered")))
1916                       { // Handle the indexed or ordered case.
1917                         for(Uint32 i = 0; i < _cqlVal1.size(); ++i)
1918                   	{ 
1919                   	  if(_cqlVal1[i] != _cqlVal2[i])
1920                   	    {
1921 david    1.1.2.25 	      PEG_METHOD_EXIT();
1922 david    1.1.2.24 	      return false;
1923                   	    }
1924                   	}
1925                       }  
1926                     else
1927                       {
1928                         for(Uint32 i = 0; i < _cqlVal1.size(); ++i)
1929                   	{
1930                   	  result = false;
1931                   	  
1932                   	  for(Uint32 j = 0; j < _cqlVal2.size(); ++j)
1933                   	    {
1934                   	      if(_cqlVal1[i] == _cqlVal2[j])
1935                   		{
1936                   		  result = true;
1937                   		  break;
1938                   		}
1939                   	    }
1940                   	  if(result == false)
1941                   	    {
1942 david    1.1.2.25 	      PEG_METHOD_EXIT();
1943 david    1.1.2.24 	      return false;
1944                   	    }
1945                   	}
1946                         
1947                         for(Uint32 i = 0; i < _cqlVal2.size(); ++i)
1948                   	{
1949                   	  result = false;
1950                   	  
1951                   	  for(Uint32 j = 0; j < _cqlVal1.size(); ++j)
1952                   	    {
1953                   	      if(_cqlVal2[i] == _cqlVal1[j])
1954                   		{
1955                   		  result = true;
1956                   		  break;
1957                   		}
1958                   	    }
1959                   	  if(result == false)
1960                   	    {
1961 david    1.1.2.25 	      PEG_METHOD_EXIT();
1962 david    1.1.2.24 	      return false;
1963                   	    }
1964                   	}
1965                       }
1966 david    1.1.2.25   PEG_METHOD_EXIT();
1967 david    1.1.2.18   return true;
1968 david    1.1.2.9  }
1969                   
1970 david    1.1.2.1  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2