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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2