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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2