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

   1 mike  1.1.2.1 //%2006////////////////////////////////////////////////////////////////////////
   2               //
   3               // 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               // IBM Corp.; EMC Corporation, The Open Group.
   7               // 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               // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  12               // EMC Corporation; Symantec Corporation; The Open Group.
  13               //
  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 mike  1.1.2.1 // 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               
  34               #include <cstdarg>
  35               #include <Pegasus/Common/Resolver.h>
  36 mike  1.1.2.6 #include <Pegasus/Common/Once.h>
  37               #include <Pegasus/Common/System.h>
  38 mike  1.1.2.1 #include "MemoryResidentRepository.h"
  39               #include "RepositoryDeclContext.h"
  40               #include "Filtering.h"
  41 mike  1.1.2.3 #include "Serialization.h"
  42 mike  1.1.2.7 #include "SchemaTypes.h"
  43 mike  1.1.2.1 
  44               PEGASUS_NAMESPACE_BEGIN
  45               
  46 mike  1.1.2.7 typedef const SchemaClass* ConstSchemaClassPtr;
  47               #define PEGASUS_ARRAY_T ConstSchemaClassPtr
  48 mike  1.1.2.6 # include <Pegasus/Common/ArrayInter.h>
  49               # include <Pegasus/Common/ArrayImpl.h>
  50               #undef PEGASUS_ARRAY_T
  51               
  52 mike  1.1.2.2 #define PEGASUS_ARRAY_T NamespaceInstancePair
  53               # include <Pegasus/Common/ArrayImpl.h>
  54               #undef PEGASUS_ARRAY_T
  55               
  56 mike  1.1.2.1 //==============================================================================
  57               //
  58 mike  1.1.2.6 // Local definitions:
  59 mike  1.1.2.1 //
  60               //==============================================================================
  61               
  62 mike  1.1.2.6 static size_t const _MAX_NAMESPACE_TABLE_SIZE = 64;
  63 mike  1.1.2.7 static const SchemaNameSpace* _nameSpaceTable[_MAX_NAMESPACE_TABLE_SIZE];
  64 mike  1.1.2.6 static size_t _nameSpaceTableSize = 0;
  65               
  66 mike  1.1.2.5 class ThrowContext
  67 mike  1.1.2.1 {
  68 mike  1.1.2.5 public:
  69 mike  1.1.2.1 
  70 mike  1.1.2.5     PEGASUS_FORMAT(3, 4)
  71                   ThrowContext(CIMStatusCode code_, const char* format, ...) : code(code_)
  72                   {
  73                       char buffer[1024];
  74                       va_list ap;
  75                       va_start(ap, format);
  76                       vsprintf(buffer, format, ap);
  77                       va_end(ap);
  78                       msg = buffer;
  79                   }
  80                   CIMStatusCode code;
  81                   String msg;
  82               };
  83               
  84               #define Throw(ARGS) \
  85                   do \
  86                   { \
  87                       ThrowContext c ARGS; \
  88                       throw CIMException(c.code, c.msg); \
  89                   } \
  90                   while (0)
  91 mike  1.1.2.1 
  92               class Str
  93               {
  94               public:
  95                   Str(const String& s) : _cstr(s.getCString()) { }
  96                   Str(const CIMName& n) : _cstr(n.getString().getCString()) { }
  97                   Str(const CIMNamespaceName& n) : _cstr(n.getString().getCString()) { }
  98                   Str(const Exception& e) : _cstr(e.getMessage().getCString()) { }
  99                   Str(const CIMDateTime& x) : _cstr(x.toString().getCString()) { }
 100                   Str(const CIMObjectPath& x) : _cstr(x.toString().getCString()) { }
 101                   const char* operator*() const { return (const char*)_cstr; }
 102                   operator const char*() const { return (const char*)_cstr; }
 103               private:
 104                   CString _cstr;
 105               };
 106               
 107               static bool _contains(const CIMPropertyList& propertyList, const CIMName& name)
 108               {
 109                   for (Uint32 i = 0; i < propertyList.size(); i++)
 110                   {
 111                       if (propertyList[i] == name)
 112 mike  1.1.2.1             return true;
 113                   }
 114               
 115                   return false;
 116               }
 117               
 118               static void _applyModifiedInstance(
 119 mike  1.1.2.8     const SchemaClass* sc,
 120 mike  1.1.2.1     const CIMInstance& modifiedInstance_,
 121                   const CIMPropertyList& propertyList,
 122                   CIMInstance& resultInstance)
 123               {
 124                   CIMInstance& modifiedInstance = *((CIMInstance*)&modifiedInstance_);
 125               
 126                   for (Uint32 i = 0; i < modifiedInstance.getPropertyCount(); i++)
 127                   {
 128                       CIMProperty cp = modifiedInstance.getProperty(i);
 129                       Uint32 pos = resultInstance.findProperty(cp.getName());
 130               
 131                       if (propertyList.isNull() || _contains(propertyList, cp.getName()))
 132                       {
 133                           // Reject attempts to add properties not in class:
 134               
 135 mike  1.1.2.8             const SchemaFeature* sf = FindFeature(sc, 
 136 mike  1.1.2.7                 *Str(cp.getName()), SCHEMA_FLAG_PROPERTY|SCHEMA_FLAG_REFERENCE);
 137 mike  1.1.2.1 
 138 mike  1.1.2.8             if (!sf)
 139 mike  1.1.2.1             {
 140 mike  1.1.2.5                 Throw((CIM_ERR_NOT_FOUND, 
 141 mike  1.1.2.1                     "modifyInstance() failed: unknown property: %s",
 142 mike  1.1.2.5                     *Str(cp.getName())));
 143 mike  1.1.2.1             }
 144               
 145                           // Reject attempts to modify key properties:
 146               
 147 mike  1.1.2.8             if (sf->flags & SCHEMA_FLAG_KEY)
 148 mike  1.1.2.1             {
 149 mike  1.1.2.5                 Throw((CIM_ERR_FAILED,
 150 mike  1.1.2.1                     "modifyInstance() failed to modify key property: %s",
 151 mike  1.1.2.5                     *Str(cp.getName())));
 152 mike  1.1.2.1             }
 153               
 154                           // Add or replace property in result instance:
 155               
 156                           if (pos != PEG_NOT_FOUND)
 157                               resultInstance.removeProperty(pos);
 158               
 159                           resultInstance.addProperty(cp);
 160                       }
 161                   }
 162               }
 163               
 164               static void _print(const CIMInstance& ci)
 165               {
 166                   CIMObject co(ci);
 167               
 168                   std::cout << co.toString() << std::endl;
 169               }
 170               
 171 mike  1.1.2.6 static Once _once = PEGASUS_ONCE_INITIALIZER;
 172               static const char* _hostName = 0;
 173               
 174               static void _initHostName()
 175               {
 176                   String hn = System::getHostName();
 177                   _hostName = strdup(*Str(hn));
 178               }
 179               
 180               static inline const char* _getHostName()
 181               {
 182                   once(&_once, _initHostName);
 183                   return _hostName;
 184               }
 185               
 186               static bool _eqi(const char* s1, const char* s2)
 187               {
 188                   return System::strcasecmp(s1, s2) == 0;
 189               }
 190               
 191 mike  1.1.2.7 static const SchemaNameSpace* _findNameSpace(const char* name)
 192 mike  1.1.2.6 {
 193                   for (size_t i = 0; i < _nameSpaceTableSize; i++)
 194                   {
 195 mike  1.1.2.7         const SchemaNameSpace* ns = _nameSpaceTable[i];
 196 mike  1.1.2.6 
 197                       if (_eqi(ns->name, name))
 198                           return ns;
 199                   }
 200               
 201                   // Not found!
 202                   return 0;
 203               }
 204               
 205 mike  1.1.2.7 static bool _isSubClass(const SchemaClass* super, const SchemaClass* sub)
 206 mike  1.1.2.6 {
 207                   if (!super)
 208                       return true;
 209               
 210 mike  1.1.2.7     for (SchemaClass* p = sub->super; p; p = p->super)
 211 mike  1.1.2.6     {
 212                       if (p == super)
 213                           return true;
 214                   }
 215               
 216                   return false;
 217               }
 218               
 219               static inline bool _isDirectSubClass(
 220 mike  1.1.2.7     const SchemaClass* super, 
 221                   const SchemaClass* sub)
 222 mike  1.1.2.6 {
 223                   return sub->super == super;
 224               }
 225               
 226               static char** _makePropertyList(const CIMPropertyList& propertyList)
 227               {
 228                   if (propertyList.isNull())
 229                       return 0;
 230               
 231                   size_t size = propertyList.size();
 232                   char** pl = (char**)malloc(sizeof(char*) * (size + 1));
 233               
 234                   for (size_t i = 0; i < size; i++)
 235                       pl[i] = strdup(*Str(propertyList[i]));
 236               
 237                   pl[size] = 0;
 238               
 239                   return pl;
 240               }
 241               
 242               static void _freePropertyList(char** pl)
 243 mike  1.1.2.6 {
 244                   if (!pl)
 245                       return;
 246               
 247                   for (size_t i = 0; pl[i]; i++)
 248                   {
 249                       free(pl[i]);
 250                   }
 251               
 252                   free(pl);
 253               }
 254               
 255               static void _printPropertyList(const char* const* pl)
 256               {
 257                   if (!pl)
 258                       return;
 259               
 260                   for (size_t i = 0; pl[i]; i++)
 261                       printf("pl[%s]\n", pl[i]);
 262               }
 263               
 264 mike  1.1.2.8 static bool _contains(const Array<const SchemaClass*>& x, const SchemaClass* sc)
 265 mike  1.1.2.6 {
 266                   Uint32 n = x.size();
 267 mike  1.1.2.7     const SchemaClass* const* p = x.getData();
 268 mike  1.1.2.6 
 269                   while (n--)
 270                   {
 271 mike  1.1.2.8         if (*p++ == sc)
 272 mike  1.1.2.6             return true;
 273                   }
 274               
 275                   return false;
 276               }
 277               
 278               static void _associators(
 279 mike  1.1.2.7     const SchemaNameSpace* ns,
 280 mike  1.1.2.6     const CIMName& className,
 281                   const CIMName& assocClass,
 282                   const CIMName& resultClass,
 283                   const String& role,
 284                   const String& resultRole,
 285 mike  1.1.2.7     Array<const SchemaClass*>& result)
 286 mike  1.1.2.6 {
 287                   // Lookup source class:
 288               
 289 mike  1.1.2.8     const SchemaClass* sc = FindClass(ns, *Str(className));
 290 mike  1.1.2.6     
 291 mike  1.1.2.8     if (!sc)
 292 mike  1.1.2.6         Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
 293               
 294               
 295                   // Lookup result class (if any).
 296               
 297 mike  1.1.2.7     const SchemaClass* rmc = 0;
 298 mike  1.1.2.6 
 299                   if (!resultClass.isNull())
 300                   {
 301                       rmc = FindClass(ns, *Str(resultClass));
 302               
 303                       if (!rmc)
 304                           Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(resultClass)));
 305                   }
 306               
 307                   // Convert these to UTF8 now to avoid doing so in loop below.
 308               
 309                   Str ac(assocClass);
 310                   Str r(role);
 311                   Str rr(resultRole);
 312               
 313                   // Process association classes:
 314               
 315                   for (size_t i = 0; ns->classes[i]; i++)
 316                   {
 317 mike  1.1.2.7         SchemaClass* amc = ns->classes[i];
 318 mike  1.1.2.6 
 319                       // Skip non-association classes:
 320               
 321 mike  1.1.2.7         if (!(amc->flags & SCHEMA_FLAG_ASSOCIATION))
 322 mike  1.1.2.6             continue;
 323               
 324                       // Filter by assocClass parameter:
 325               
 326                       if (!assocClass.isNull() && !_eqi(ac, amc->name))
 327                           continue;
 328               
 329                       // Process reference properties:
 330               
 331 mike  1.1.2.7         SchemaFeatureInfo features[SCHEMA_MAX_FEATURES];
 332 mike  1.1.2.6         size_t size = 0;
 333 mike  1.1.2.7         MergeFeatures(amc, false, SCHEMA_FLAG_REFERENCE, features, size);
 334 mike  1.1.2.6 
 335                       for (size_t j = 0; j < size; j++)
 336                       {
 337 mike  1.1.2.8             const SchemaFeature* sf = features[j].sf;
 338 mike  1.1.2.6 
 339                           // Skip non references:
 340               
 341 mike  1.1.2.8             if (!(sf->flags & SCHEMA_FLAG_REFERENCE))
 342 mike  1.1.2.6                 continue;
 343               
 344 mike  1.1.2.8             const SchemaReference* sr = (const SchemaReference*)sf;
 345 mike  1.1.2.6 
 346                           // Filter by role parameter.
 347               
 348 mike  1.1.2.8             if (role.size() && !_eqi(r, sf->name))
 349 mike  1.1.2.6                 continue;
 350               
 351                           // Filter by source class:
 352               
 353 mike  1.1.2.8             if (!IsA(sr->ref, sc))
 354 mike  1.1.2.6                 continue;
 355               
 356                           // Process result reference:
 357               
 358                           for (size_t k = 0; k < size; k++)
 359                           {
 360 mike  1.1.2.8                 const SchemaFeature* rmf = features[k].sf;
 361 mike  1.1.2.6 
 362                               // Skip the feature under consideration:
 363               
 364 mike  1.1.2.8                 if (rmf == sf)
 365 mike  1.1.2.6                     continue;
 366               
 367                               // Skip non references:
 368               
 369 mike  1.1.2.7                 if (!(rmf->flags & SCHEMA_FLAG_REFERENCE))
 370 mike  1.1.2.6                     continue;
 371               
 372 mike  1.1.2.7                 const SchemaReference* rmr = (const SchemaReference*)rmf;
 373 mike  1.1.2.6 
 374                               // Filter by resultRole parameter.
 375               
 376                               if (resultRole.size() && !_eqi(rr, rmf->name))
 377                                   continue;
 378               
 379                               // Skip references not of the result class kind:
 380               
 381                               if (rmc && !IsA(rmr->ref, rmc))
 382                                   continue;
 383               
 384                               // ATTN: should we include entire class hierarchy under
 385                               // result class?
 386               
 387                               // If reached, then save this one.
 388               
 389                               if (!_contains(result, rmr->ref))
 390                                   result.append(rmr->ref);
 391                           }
 392                       }
 393                   }
 394 mike  1.1.2.6 }
 395               
 396               static void _references(
 397 mike  1.1.2.7     const SchemaNameSpace* ns,
 398 mike  1.1.2.6     const CIMName& className,
 399                   const CIMName& resultClass,
 400                   const String& role,
 401 mike  1.1.2.7     Array<const SchemaClass*>& result)
 402 mike  1.1.2.6 {
 403                   // Lookup source class:
 404               
 405 mike  1.1.2.8     const SchemaClass* sc = FindClass(ns, *Str(className));
 406 mike  1.1.2.6     
 407 mike  1.1.2.8     if (!sc)
 408 mike  1.1.2.6         Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
 409               
 410                   // Lookup result class (if any).
 411               
 412 mike  1.1.2.7     const SchemaClass* rmc = 0;
 413 mike  1.1.2.6 
 414                   if (!resultClass.isNull())
 415                   {
 416                       rmc = FindClass(ns, *Str(resultClass));
 417               
 418                       if (!rmc)
 419                           Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(resultClass)));
 420                   }
 421               
 422                   // Convert these to UTF8 now to avoid doing so in loop below.
 423               
 424                   Str r(role);
 425               
 426                   // Process association classes:
 427               
 428                   for (size_t i = 0; ns->classes[i]; i++)
 429                   {
 430 mike  1.1.2.7         SchemaClass* amc = ns->classes[i];
 431 mike  1.1.2.6 
 432                       // Skip non-association classes:
 433               
 434 mike  1.1.2.7         if (!(amc->flags & SCHEMA_FLAG_ASSOCIATION))
 435 mike  1.1.2.6             continue;
 436               
 437                       // Filter by result class:
 438               
 439                       if (rmc && !IsA(rmc, amc))
 440                           continue;
 441               
 442                       // Process reference properties:
 443               
 444 mike  1.1.2.7         SchemaFeatureInfo features[SCHEMA_MAX_FEATURES];
 445 mike  1.1.2.6         size_t size = 0;
 446 mike  1.1.2.7         MergeFeatures(amc, false, SCHEMA_FLAG_REFERENCE, features, size);
 447 mike  1.1.2.6 
 448                       for (size_t j = 0; j < size; j++)
 449                       {
 450 mike  1.1.2.8             const SchemaFeature* sf = features[j].sf;
 451 mike  1.1.2.6 
 452                           // Skip non references:
 453               
 454 mike  1.1.2.8             if (!(sf->flags & SCHEMA_FLAG_REFERENCE))
 455 mike  1.1.2.6                 continue;
 456               
 457 mike  1.1.2.8             const SchemaReference* sr = (const SchemaReference*)sf;
 458 mike  1.1.2.6 
 459                           // Filter by role parameter.
 460               
 461 mike  1.1.2.8             if (role.size() && !_eqi(r, sf->name))
 462 mike  1.1.2.6                 continue;
 463               
 464                           // Filter by source class:
 465               
 466 mike  1.1.2.8             if (!IsA(sr->ref, sc))
 467 mike  1.1.2.6                 continue;
 468               
 469                           // Add this one to the output:
 470               
 471                           if (!_contains(result, amc))
 472 mike  1.1.2.7                 result.append((SchemaClass*)amc);
 473 mike  1.1.2.6         }
 474                   }
 475               }
 476               
 477 mike  1.1.2.7 static const SchemaClass* _findSchemaClass(
 478 mike  1.1.2.6     const char* nameSpace,
 479                   const char* className)
 480               {
 481                   // Lookup namespace:
 482               
 483 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(nameSpace);
 484 mike  1.1.2.6 
 485                   if (!ns)
 486                       return 0;
 487               
 488                   return FindClass(ns, className);
 489               }
 490               
 491               static Array<CIMName> _enumerateClassNames(
 492                   const CIMNamespaceName& nameSpace,
 493                   const CIMName& className,
 494                   Boolean deepInheritance)
 495               {
 496                   // Lookup namespace:
 497               
 498 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 499 mike  1.1.2.6 
 500                   if (!ns)
 501                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 502               
 503                   // Lookup class:
 504               
 505 mike  1.1.2.7     const SchemaClass* super = 0;
 506 mike  1.1.2.6     
 507                   if (!className.isNull())
 508                   {
 509                       super = FindClass(ns, *Str(className));
 510               
 511                       if (!super)
 512                           Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
 513                   }
 514               
 515                   // Iterate all classes looking for matches:
 516               
 517                   Array<CIMName> result;
 518               
 519                   for (size_t i = 0; ns->classes[i]; i++)
 520                   {
 521 mike  1.1.2.8         SchemaClass* sc = ns->classes[i];
 522 mike  1.1.2.6 
 523                       if (deepInheritance)
 524                       {
 525 mike  1.1.2.8             if (_isSubClass(super, sc))
 526                               result.append(sc->name);
 527 mike  1.1.2.6         }
 528                       else
 529                       {
 530 mike  1.1.2.8             if (_isDirectSubClass(super, sc))
 531                               result.append(sc->name);
 532 mike  1.1.2.6         }
 533                   }
 534               
 535                   return result;
 536               }
 537               
 538               static void _getSubClassNames(
 539                   const CIMNamespaceName& nameSpace,
 540                   const CIMName& className,
 541                   Boolean deepInheritance,
 542                   Array<CIMName>& subClassNames)
 543               {
 544                   subClassNames = _enumerateClassNames(
 545                       nameSpace, className, deepInheritance);
 546               }
 547               
 548               static Array<CIMObject> _associatorClasses(
 549                   const CIMNamespaceName& nameSpace,
 550                   const CIMName& className,
 551                   const CIMName& assocClass,
 552                   const CIMName& resultClass,
 553 mike  1.1.2.6     const String& role,
 554                   const String& resultRole,
 555                   Boolean includeQualifiers,
 556                   Boolean includeClassOrigin,
 557                   const CIMPropertyList& propertyList)
 558               {
 559                   // Lookup namespace:
 560               
 561 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 562 mike  1.1.2.6 
 563                   if (!ns)
 564                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 565               
 566 mike  1.1.2.7     // Get associator schema-classes:
 567 mike  1.1.2.6 
 568 mike  1.1.2.7     Array<const SchemaClass*> mcs;
 569 mike  1.1.2.6     _associators(ns, className, assocClass, resultClass, role, resultRole, mcs);
 570               
 571 mike  1.1.2.7     // Convert schema-classes to classes.
 572 mike  1.1.2.6 
 573                   Array<CIMObject> result;
 574               
 575                   char** pl = _makePropertyList(propertyList);
 576               
 577                   for (Uint32 i = 0; i < mcs.size(); i++)
 578                   {
 579 mike  1.1.2.8         const SchemaClass* sc = mcs[i];
 580 mike  1.1.2.6         CIMClass cc;
 581               
 582 mike  1.1.2.8         if (MakeClass(_getHostName(), ns, sc, false, includeQualifiers, 
 583 mike  1.1.2.6             includeClassOrigin, pl, cc) != 0)
 584                       {
 585                           _freePropertyList(pl);
 586 mike  1.1.2.8             Throw((CIM_ERR_FAILED, "conversion failed: %s", sc->name));
 587 mike  1.1.2.6         }
 588               
 589                       result.append(cc);
 590                   }
 591               
 592                   _freePropertyList(pl);
 593                   return result;
 594               }
 595               
 596               static Array<CIMObjectPath> _associatorClassPaths(
 597                   const CIMNamespaceName& nameSpace,
 598                   const CIMName& className,
 599                   const CIMName& assocClass,
 600                   const CIMName& resultClass,
 601                   const String& role,
 602                   const String& resultRole)
 603               {
 604                   // Lookup namespace:
 605               
 606 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 607 mike  1.1.2.6 
 608                   if (!ns)
 609                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 610               
 611 mike  1.1.2.7     // Get associator schema-classes:
 612 mike  1.1.2.6 
 613 mike  1.1.2.7     Array<const SchemaClass*> mcs;
 614 mike  1.1.2.6     _associators(ns, className, assocClass, resultClass, role, resultRole, mcs);
 615               
 616 mike  1.1.2.7     // Convert schema-classes to object names:
 617 mike  1.1.2.6 
 618                   Array<CIMObjectPath> result;
 619               
 620                   for (Uint32 i = 0; i < mcs.size(); i++)
 621                       result.append(CIMObjectPath(_getHostName(), nameSpace, mcs[i]->name));
 622               
 623                   return result;
 624               }
 625               
 626               static Array<CIMObject> _referenceClasses(
 627                   const CIMNamespaceName& nameSpace,
 628                   const CIMName& className,
 629                   const CIMName& resultClass,
 630                   const String& role,
 631                   Boolean includeQualifiers,
 632                   Boolean includeClassOrigin,
 633                   const CIMPropertyList& propertyList)
 634               {
 635                   // Lookup namespace:
 636               
 637 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 638 mike  1.1.2.6 
 639                   if (!ns)
 640                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 641               
 642 mike  1.1.2.7     // Get reference schema-classes:
 643 mike  1.1.2.6 
 644 mike  1.1.2.7     Array<const SchemaClass*> mcs;
 645 mike  1.1.2.6     _references(ns, className, resultClass, role, mcs);
 646               
 647 mike  1.1.2.7     // Convert schema-classes to classes.
 648 mike  1.1.2.6 
 649                   Array<CIMObject> result;
 650               
 651                   char** pl = _makePropertyList(propertyList);
 652               
 653                   for (Uint32 i = 0; i < mcs.size(); i++)
 654                   {
 655 mike  1.1.2.8         const SchemaClass* sc = mcs[i];
 656 mike  1.1.2.6         CIMClass cc;
 657               
 658 mike  1.1.2.8         if (MakeClass(_getHostName(), ns, sc, false, includeQualifiers, 
 659 mike  1.1.2.6             includeClassOrigin, pl, cc) != 0)
 660                       {
 661                           _freePropertyList(pl);
 662 mike  1.1.2.8             Throw((CIM_ERR_FAILED, "conversion failed: %s", sc->name));
 663 mike  1.1.2.6         }
 664               
 665                       result.append(cc);
 666                   }
 667               
 668                   _freePropertyList(pl);
 669                   return result;
 670               }
 671               
 672               static Array<CIMObjectPath> _referenceClassPaths(
 673                   const CIMNamespaceName& nameSpace,
 674                   const CIMName& className,
 675                   const CIMName& resultClass,
 676                   const String& role)
 677               {
 678                   // Lookup namespace:
 679               
 680 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 681 mike  1.1.2.6 
 682                   if (!ns)
 683                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 684               
 685 mike  1.1.2.7     // Get reference schema-classes:
 686 mike  1.1.2.6 
 687 mike  1.1.2.7     Array<const SchemaClass*> mcs;
 688 mike  1.1.2.6     _references(ns, className, resultClass, role, mcs);
 689               
 690 mike  1.1.2.7     // Convert schema-classes to object paths.
 691 mike  1.1.2.6 
 692                   Array<CIMObjectPath> result;
 693               
 694                   for (Uint32 i = 0; i < mcs.size(); i++)
 695                       result.append(CIMObjectPath(_getHostName(), nameSpace, mcs[i]->name));
 696               
 697                   return result;
 698               }
 699               
 700               static CIMQualifierDecl _getQualifier(
 701                   const CIMNamespaceName& nameSpace,
 702                   const CIMName& qualifierName)
 703               {
 704                   // Lookup namespace:
 705               
 706 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 707 mike  1.1.2.6 
 708                   if (!ns)
 709                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 710               
 711                   // Lookup qualifier:
 712               
 713 mike  1.1.2.7     const SchemaQualifierDecl* mqd = FindQualifierDecl(ns, *Str(qualifierName));
 714 mike  1.1.2.6     
 715                   if (!mqd)
 716                       Throw((CIM_ERR_NOT_FOUND, 
 717                           "unknown qualifier: %s", *Str(qualifierName)));
 718               
 719                   // Make the qualifier declaration:
 720               
 721                   CIMQualifierDecl cqd;
 722               
 723                   if (MakeQualifierDecl(ns, mqd, cqd) != 0)
 724                   {
 725                       Throw((CIM_ERR_FAILED, "conversion failed: %s", mqd->name));
 726                   }
 727               
 728                   return cqd;
 729               }
 730               
 731               static Array<CIMQualifierDecl> _enumerateQualifiers(
 732                   const CIMNamespaceName& nameSpace)
 733               {
 734                   // Lookup namespace:
 735 mike  1.1.2.6 
 736 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 737 mike  1.1.2.6 
 738                   if (!ns)
 739                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 740               
 741                   // Build the array of qualifier declarations:
 742               
 743                   Array<CIMQualifierDecl> result;
 744               
 745                   for (size_t i = 0; ns->qualifiers[i]; i++)
 746                   {
 747 mike  1.1.2.7         const SchemaQualifierDecl* mqd = ns->qualifiers[i];
 748 mike  1.1.2.6         CIMQualifierDecl cqd;
 749               
 750                       if (MakeQualifierDecl(ns, mqd, cqd) != 0)
 751                       {
 752                           Throw((CIM_ERR_FAILED, "conversion failed: %s", mqd->name));
 753                       }
 754               
 755                       result.append(cqd);
 756                   }
 757               
 758                   return result;
 759               
 760               }
 761               
 762               static Array<CIMNamespaceName> _enumerateNameSpaces()
 763               {
 764                   Array<CIMNamespaceName> result;
 765               
 766                   for (size_t i = 0; i < _nameSpaceTableSize; i++)
 767                   {
 768 mike  1.1.2.7         const SchemaNameSpace* ns = _nameSpaceTable[i];
 769 mike  1.1.2.6         result.append(ns->name);
 770                   }
 771               
 772                   return result;
 773               }
 774               
 775               static void _getSuperClassNames(
 776                   const CIMNamespaceName& nameSpace,
 777                   const CIMName& className,
 778                   Array<CIMName>& superClassNames)
 779               {
 780                   superClassNames.clear();
 781               
 782                   // Lookup namespace:
 783               
 784 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 785 mike  1.1.2.6 
 786                   if (!ns)
 787                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 788               
 789                   // Lookup class:
 790               
 791 mike  1.1.2.8     const SchemaClass* sc = FindClass(ns, *Str(className));
 792 mike  1.1.2.6     
 793 mike  1.1.2.8     if (!sc)
 794 mike  1.1.2.6         Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
 795               
 796                   // Append superclass names:
 797               
 798 mike  1.1.2.8     for (const SchemaClass* p = sc->super; p; p = p->super)
 799 mike  1.1.2.6         superClassNames.append(p->name);
 800               }
 801               
 802 mike  1.1.2.1 //==============================================================================
 803               //
 804               // class MemoryResidentRepository:
 805               //
 806               //==============================================================================
 807               
 808 mike  1.1.2.4 static void (*_saveCallback)(const Buffer& buffer, void* data);
 809               static void* _saveData;
 810               static void (*_loadCallback)(Buffer& buffer, void* data);
 811               static void* _loadData;
 812 mike  1.1.2.3 
 813 mike  1.1.2.7 MemoryResidentRepository::MemoryResidentRepository()
 814 mike  1.1.2.1 {
 815 mike  1.1.2.3     // Load users data if any:
 816                   _processLoadHandler();
 817 mike  1.1.2.1 }
 818               
 819               MemoryResidentRepository::~MemoryResidentRepository()
 820               {
 821               }
 822               
 823               CIMClass MemoryResidentRepository::getClass(
 824                   bool lock,
 825                   const CIMNamespaceName& nameSpace,
 826                   const CIMName& className,
 827                   Boolean localOnly,
 828                   Boolean includeQualifiers,
 829                   Boolean includeClassOrigin,
 830                   const CIMPropertyList& propertyList)
 831               {
 832 mike  1.1.2.6     // Lookup namespace:
 833               
 834 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
 835 mike  1.1.2.6 
 836                   if (!ns)
 837                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
 838               
 839                   // Lookup class:
 840               
 841 mike  1.1.2.8     const SchemaClass* sc = FindClass(ns, *Str(className));
 842 mike  1.1.2.6 
 843 mike  1.1.2.8     if (!sc)
 844 mike  1.1.2.6     {
 845                       Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
 846                   }
 847               
 848                   // Build property list:
 849               
 850                   char** pl = _makePropertyList(propertyList);
 851               
 852                   // Make class:
 853               
 854                   CIMClass cc;
 855               
 856 mike  1.1.2.8     if (MakeClass(_getHostName(), ns, sc, localOnly, includeQualifiers, 
 857 mike  1.1.2.6         includeClassOrigin, pl, cc) != 0)
 858                   {
 859                       _freePropertyList(pl);
 860 mike  1.1.2.8         Throw((CIM_ERR_FAILED, "conversion failed: %s", sc->name));
 861 mike  1.1.2.6     }
 862               
 863                   _freePropertyList(pl);
 864                   return cc;
 865 mike  1.1.2.1 }
 866               
 867               CIMInstance MemoryResidentRepository::getInstance(
 868                   bool lock,
 869                   const CIMNamespaceName& nameSpace,
 870                   const CIMObjectPath& instanceName,
 871                   Boolean localOnly,
 872                   Boolean includeQualifiers,
 873                   Boolean includeClassOrigin,
 874                   const CIMPropertyList& propertyList)
 875               {
 876                   Uint32 pos = _findInstance(nameSpace, instanceName);
 877               
 878                   if (pos == PEG_NOT_FOUND)
 879 mike  1.1.2.5         Throw((CIM_ERR_NOT_FOUND, "%s", *Str(instanceName)));
 880 mike  1.1.2.1 
 881                   CIMInstance cimInstance = _rep[pos].second.clone();
 882               
 883                   Filtering::filterInstance(
 884                       cimInstance,
 885                       localOnly,
 886                       includeQualifiers,
 887                       includeClassOrigin,
 888                       propertyList);
 889               
 890                   return cimInstance;
 891               }
 892               
 893               void MemoryResidentRepository::deleteClass(
 894                   bool lock,
 895                   const CIMNamespaceName& nameSpace,
 896                   const CIMName& className)
 897               {
 898 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "deleteClass()"));
 899 mike  1.1.2.1 }
 900               
 901               void MemoryResidentRepository::deleteInstance(
 902                   bool lock,
 903                   const CIMNamespaceName& nameSpace,
 904                   const CIMObjectPath& instanceName)
 905               {
 906                   Uint32 pos = _findInstance(nameSpace, instanceName);
 907               
 908                   if (pos == PEG_NOT_FOUND)
 909 mike  1.1.2.5         Throw((CIM_ERR_NOT_FOUND, "%s", *Str(instanceName)));
 910 mike  1.1.2.1 
 911                   _rep.remove(pos);
 912 mike  1.1.2.3     _processSaveHandler();
 913 mike  1.1.2.1 }
 914               
 915               void MemoryResidentRepository::createClass(
 916                   bool lock,
 917                   const CIMNamespaceName& nameSpace,
 918                   const CIMClass& newClass,
 919                   const ContentLanguageList& contentLangs)
 920               {
 921 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "createClass()"));
 922 mike  1.1.2.1 }
 923               
 924               CIMObjectPath MemoryResidentRepository::createInstance(
 925                   bool lock,
 926                   const CIMNamespaceName& nameSpace,
 927                   const CIMInstance& newInstance,
 928                   const ContentLanguageList& contentLangs)
 929               {
 930                   // Resolve the instance first:
 931               
 932                   CIMInstance ci(newInstance.clone());
 933                   CIMConstClass cc;
 934                   RepositoryDeclContext context(this);
 935                   Resolver::resolveInstance(ci, &context, nameSpace, cc, false);
 936                   CIMObjectPath cop = ci.buildPath(cc);
 937               
 938                   ci.setPath(cop);
 939               
 940                   // Reject if an instance with this name already exists:
 941               
 942                   if (_findInstance(nameSpace, cop) != PEG_NOT_FOUND)
 943 mike  1.1.2.5         Throw((CIM_ERR_ALREADY_EXISTS, "%s", *Str(cop)));
 944 mike  1.1.2.1 
 945                   // Add instance to array:
 946               
 947                   _rep.append(NamespaceInstancePair(nameSpace, ci));
 948 mike  1.1.2.3     _processSaveHandler();
 949 mike  1.1.2.1 
 950                   return cop;
 951               }
 952               
 953               void MemoryResidentRepository::modifyClass(
 954                   bool lock,
 955                   const CIMNamespaceName& nameSpace,
 956                   const CIMClass& modifiedClass,
 957                   const ContentLanguageList& contentLangs)
 958               {
 959 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "modifyClass()"));
 960 mike  1.1.2.1 }
 961               
 962               void MemoryResidentRepository::modifyInstance(
 963                   bool lock,
 964                   const CIMNamespaceName& nameSpace,
 965                   const CIMInstance& modifiedInstance,
 966                   Boolean includeQualifiers,
 967                   const CIMPropertyList& propertyList,
 968                   const ContentLanguageList& contentLangs)
 969               {
 970                   const CIMObjectPath& cop = modifiedInstance.getPath();
 971                   CIMName className = cop.getClassName();
 972               
 973 mike  1.1.2.7     // Get the schema-class for this instance.
 974 mike  1.1.2.1 
 975 mike  1.1.2.8     const SchemaClass* sc = _findSchemaClass(*Str(nameSpace), *Str(className));
 976 mike  1.1.2.1 
 977 mike  1.1.2.8     if (!sc)
 978 mike  1.1.2.1     {
 979 mike  1.1.2.5         Throw((CIM_ERR_FAILED, 
 980 mike  1.1.2.1             "modifyInstance() failed: unknown class: %s:%s",
 981 mike  1.1.2.5             *Str(nameSpace), *Str(className)));
 982 mike  1.1.2.1     }
 983               
 984                   // Get original instance to be modified:
 985               
 986                   Uint32 pos = _findInstance(nameSpace, cop);
 987               
 988                   if (pos == PEG_NOT_FOUND)
 989                   {
 990 mike  1.1.2.5         Throw((CIM_ERR_NOT_FOUND, 
 991                           "modifyInstance() failed: unknown instance: %s",
 992                           *Str(cop.toString())));
 993 mike  1.1.2.1     }
 994               
 995                   CIMInstance resultInstance = _rep[pos].second.clone();
 996               
 997                   // Apply features of modifiedInstance to result instance.
 998               
 999 mike  1.1.2.8     _applyModifiedInstance(sc, modifiedInstance, propertyList, resultInstance);
1000 mike  1.1.2.1 
1001                   // Resolve the instance.
1002               
1003                   CIMConstClass cc;
1004                   RepositoryDeclContext context(this);
1005                   Resolver::resolveInstance(resultInstance, &context, nameSpace, cc, false);
1006               
1007                   // Replace original instance.
1008               
1009                   _rep[pos].second = resultInstance;
1010 mike  1.1.2.3     _processSaveHandler();
1011 mike  1.1.2.1 }
1012               
1013               Array<CIMClass> MemoryResidentRepository::enumerateClasses(
1014                   bool lock,
1015                   const CIMNamespaceName& nameSpace,
1016                   const CIMName& className,
1017                   Boolean deepInheritance,
1018                   Boolean localOnly,
1019                   Boolean includeQualifiers,
1020                   Boolean includeClassOrigin)
1021               {
1022 mike  1.1.2.6     // Lookup namespace:
1023               
1024 mike  1.1.2.7     const SchemaNameSpace* ns = _findNameSpace(*Str(nameSpace));
1025 mike  1.1.2.6 
1026                   if (!ns)
1027                       Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
1028               
1029                   // Lookup class:
1030               
1031 mike  1.1.2.7     const SchemaClass* super = 0;
1032 mike  1.1.2.6     
1033                   if (!className.isNull())
1034                   {
1035                       super = FindClass(ns, *Str(className));
1036               
1037                       if (!super)
1038                           Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
1039                   }
1040               
1041                   // Iterate all classes looking for matches:
1042               
1043                   Array<CIMClass> result;
1044               
1045                   for (size_t i = 0; ns->classes[i]; i++)
1046                   {
1047 mike  1.1.2.8         SchemaClass* sc = ns->classes[i];
1048 mike  1.1.2.6 
1049                       bool flag = false;
1050               
1051                       if (deepInheritance)
1052                       {
1053 mike  1.1.2.8             if (_isSubClass(super, sc))
1054 mike  1.1.2.6                 flag = true;
1055                       }
1056                       else
1057                       {
1058 mike  1.1.2.8             if (_isDirectSubClass(super, sc))
1059 mike  1.1.2.6                 flag = true;
1060                       }
1061               
1062                       if (flag)
1063                       {
1064                           CIMClass cc;
1065               
1066 mike  1.1.2.8             if (MakeClass(_getHostName(), ns, sc, localOnly, includeQualifiers, 
1067 mike  1.1.2.6                 includeClassOrigin, 0, cc) != 0)
1068                           {
1069 mike  1.1.2.8                 Throw((CIM_ERR_FAILED, "conversion failed: %s", sc->name));
1070 mike  1.1.2.6             }
1071               
1072                           result.append(cc);
1073                       }
1074                   }
1075               
1076                   return result;
1077 mike  1.1.2.1 }
1078               
1079               Array<CIMName> MemoryResidentRepository::enumerateClassNames(
1080                   bool lock,
1081                   const CIMNamespaceName& nameSpace,
1082                   const CIMName& className,
1083                   Boolean deepInheritance)
1084               {
1085 mike  1.1.2.6     return _enumerateClassNames(nameSpace, className, deepInheritance);
1086 mike  1.1.2.1 }
1087               
1088               Array<CIMInstance> MemoryResidentRepository::enumerateInstancesForSubtree(
1089                   bool lock,
1090                   const CIMNamespaceName& nameSpace,
1091                   const CIMName& className,
1092                   Boolean deepInheritance,
1093                   Boolean localOnly,
1094                   Boolean includeQualifiers,
1095                   Boolean includeClassOrigin,
1096                   const CIMPropertyList& propertyList)
1097               {
1098                   // Form array of classnames for this class and descendent classes:
1099               
1100                   Array<CIMName> classNames;
1101                   classNames.append(className);
1102 mike  1.1.2.6     _getSubClassNames(nameSpace, className, true, classNames);
1103 mike  1.1.2.1 
1104                   // Get all instances for this class and all descendent classes
1105               
1106                   Array<CIMInstance> result;
1107               
1108                   for (Uint32 i = 0; i < classNames.size(); i++)
1109                   {
1110                       Array<CIMInstance> instances = enumerateInstancesForClass(false, 
1111                           nameSpace, classNames[i], false, includeQualifiers, 
1112                           includeClassOrigin, propertyList);
1113               
1114                       for (Uint32 i = 0 ; i < instances.size(); i++)
1115                       {
1116                           Filtering::filterInstance(
1117                               instances[i],
1118                               localOnly,
1119                               includeQualifiers,
1120                               includeClassOrigin,
1121                               propertyList);
1122                       }
1123               
1124 mike  1.1.2.1         result.appendArray(instances);
1125                   }
1126               
1127                   return result;
1128               }
1129               
1130               Array<CIMInstance> MemoryResidentRepository::enumerateInstancesForClass(
1131                   bool lock,
1132                   const CIMNamespaceName& nameSpace,
1133                   const CIMName& className,
1134                   Boolean localOnly,
1135                   Boolean includeQualifiers,
1136                   Boolean includeClassOrigin,
1137                   const CIMPropertyList& propertyList)
1138               {
1139                   Array<CIMInstance> result;
1140               
1141                   for (Uint32 i = 0; i < _rep.size(); i++)
1142                   {
1143                       if (_rep[i].first != nameSpace)
1144                           continue;
1145 mike  1.1.2.1 
1146                       CIMInstance& ci = _rep[i].second;
1147               
1148                       if (ci.getPath().getClassName() == className)
1149                       {
1150                           CIMInstance tmp = ci.clone();
1151               
1152                           Filtering::filterInstance(
1153                               tmp,
1154                               localOnly,
1155                               includeQualifiers,
1156                               includeClassOrigin,
1157                               propertyList);
1158               
1159                           result.append(tmp);
1160                       }
1161                   }
1162               
1163                   return result;
1164               }
1165               
1166 mike  1.1.2.1 Array<CIMObjectPath> MemoryResidentRepository::enumerateInstanceNamesForSubtree(
1167                   bool lock,
1168                   const CIMNamespaceName& nameSpace,
1169                   const CIMName& className)
1170               {
1171                   // Form array of classnames for this class and descendent classes:
1172               
1173                   Array<CIMName> classNames;
1174                   classNames.append(className);
1175 mike  1.1.2.6     _getSubClassNames(nameSpace, className, true, classNames);
1176 mike  1.1.2.1 
1177                   // Get all instances for this class and all descendent classes
1178               
1179                   Array<CIMObjectPath> result;
1180               
1181                   for (Uint32 i = 0; i < classNames.size(); i++)
1182                   {
1183                       Array<CIMObjectPath> paths = enumerateInstanceNamesForClass(
1184                           false, nameSpace, classNames[i]);
1185               
1186                       result.appendArray(paths);
1187                   }
1188               
1189                   return result;
1190               }
1191               
1192               Array<CIMObjectPath> MemoryResidentRepository::enumerateInstanceNamesForClass(
1193                   bool lock,
1194                   const CIMNamespaceName& nameSpace,
1195                   const CIMName& className)
1196               {
1197 mike  1.1.2.1     Array<CIMObjectPath> result;
1198               
1199                   for (Uint32 i = 0; i < _rep.size(); i++)
1200                   {
1201                       if (_rep[i].first != nameSpace)
1202                           continue;
1203               
1204                       CIMInstance& ci = _rep[i].second;
1205               
1206                       if (ci.getPath().getClassName() == className)
1207                           result.append(ci.getPath());
1208                   }
1209               
1210                   return result;
1211               }
1212               
1213               Array<CIMInstance> MemoryResidentRepository::execQuery(
1214                   bool lock,
1215                   const String& queryLanguage,
1216                   const String& query)
1217               {
1218 mike  1.1.2.5     Throw((CIM_ERR_NOT_SUPPORTED, "execQuery()"));
1219 mike  1.1.2.1     return Array<CIMInstance>();
1220               }
1221               
1222               Array<CIMObject> MemoryResidentRepository::associators(
1223                   bool lock,
1224                   const CIMNamespaceName& nameSpace,
1225                   const CIMObjectPath& objectName,
1226                   const CIMName& assocClass,
1227                   const CIMName& resultClass,
1228                   const String& role,
1229                   const String& resultRole,
1230                   Boolean includeQualifiers,
1231                   Boolean includeClassOrigin,
1232                   const CIMPropertyList& propertyList)
1233               {
1234                   if (objectName.getKeyBindings().size() == 0)
1235                   {
1236 mike  1.1.2.6         return _associatorClasses(
1237 mike  1.1.2.1             nameSpace,
1238                           objectName.getClassName(),
1239                           assocClass,
1240                           resultClass,
1241                           role,
1242                           resultRole,
1243                           includeQualifiers,
1244                           includeClassOrigin,
1245                           propertyList);
1246                   }
1247                   else
1248                   {
1249 mike  1.1.2.5         Throw((CIM_ERR_NOT_SUPPORTED, "associators()"));
1250 mike  1.1.2.1         return Array<CIMObject>();
1251                   }
1252               }
1253               
1254               Array<CIMObjectPath> MemoryResidentRepository::associatorNames(
1255                   bool lock,
1256                   const CIMNamespaceName& nameSpace,
1257                   const CIMObjectPath& objectName,
1258                   const CIMName& assocClass,
1259                   const CIMName& resultClass,
1260                   const String& role,
1261                   const String& resultRole)
1262               {
1263                   if (objectName.getKeyBindings().size() == 0)
1264                   {
1265 mike  1.1.2.6         return _associatorClassPaths(
1266 mike  1.1.2.1             nameSpace,
1267                           objectName.getClassName(),
1268                           assocClass,
1269                           resultClass,
1270                           role,
1271                           resultRole);
1272                   }
1273                   else
1274                   {
1275 mike  1.1.2.5         Throw((CIM_ERR_NOT_SUPPORTED, "associatorNames()"));
1276 mike  1.1.2.1         return Array<CIMObjectPath>();
1277                   }
1278               }
1279               
1280               Array<CIMObject> MemoryResidentRepository::references(
1281                   bool lock,
1282                   const CIMNamespaceName& nameSpace,
1283                   const CIMObjectPath& objectName,
1284                   const CIMName& resultClass,
1285                   const String& role,
1286                   Boolean includeQualifiers,
1287                   Boolean includeClassOrigin,
1288                   const CIMPropertyList& propertyList)
1289               {
1290                   if (objectName.getKeyBindings().size() == 0)
1291                   {
1292 mike  1.1.2.6         return _referenceClasses(
1293 mike  1.1.2.1             nameSpace,
1294                           objectName.getClassName(),
1295                           resultClass,
1296                           role,
1297                           includeQualifiers,
1298                           includeClassOrigin,
1299                           propertyList);
1300                   }
1301                   else
1302                   {
1303 mike  1.1.2.5         Throw((CIM_ERR_NOT_SUPPORTED, "references()"));
1304 mike  1.1.2.1         return Array<CIMObject>();
1305                   }
1306               }
1307               
1308               Array<CIMObjectPath> MemoryResidentRepository::referenceNames(
1309                   bool lock,
1310                   const CIMNamespaceName& nameSpace,
1311                   const CIMObjectPath& objectName,
1312                   const CIMName& resultClass,
1313                   const String& role)
1314               {
1315                   if (objectName.getKeyBindings().size() == 0)
1316                   {
1317 mike  1.1.2.6         return _referenceClassPaths(
1318 mike  1.1.2.1             nameSpace,
1319                           objectName.getClassName(),
1320                           resultClass,
1321                           role);
1322                   }
1323                   else
1324                   {
1325 mike  1.1.2.5         Throw((CIM_ERR_NOT_SUPPORTED, "referenceNames()"));
1326 mike  1.1.2.1         return Array<CIMObjectPath>();
1327                   }
1328               }
1329               
1330               CIMValue MemoryResidentRepository::getProperty(
1331                   bool lock,
1332                   const CIMNamespaceName& nameSpace,
1333                   const CIMObjectPath& instanceName,
1334                   const CIMName& propertyName)
1335               {
1336 mike  1.1.2.5     Throw((CIM_ERR_NOT_SUPPORTED, "getProperty()"));
1337 mike  1.1.2.1     return CIMValue();
1338               }
1339               
1340               void MemoryResidentRepository::setProperty(
1341                   bool lock,
1342                   const CIMNamespaceName& nameSpace,
1343                   const CIMObjectPath& instanceName,
1344                   const CIMName& propertyName,
1345                   const CIMValue& newValue,
1346                   const ContentLanguageList& contentLangs)
1347               {
1348 mike  1.1.2.5     Throw((CIM_ERR_NOT_SUPPORTED, "setProperty()"));
1349 mike  1.1.2.1 }
1350               
1351               CIMQualifierDecl MemoryResidentRepository::getQualifier(
1352                   bool lock,
1353                   const CIMNamespaceName& nameSpace,
1354                   const CIMName& qualifierName)
1355               {
1356 mike  1.1.2.6     return _getQualifier(nameSpace, qualifierName);
1357 mike  1.1.2.1 }
1358               
1359               void MemoryResidentRepository::setQualifier(
1360                   bool lock,
1361                   const CIMNamespaceName& nameSpace,
1362                   const CIMQualifierDecl& qualifierDecl,
1363                   const ContentLanguageList& contentLangs)
1364               {
1365 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "setQualifier()"));
1366 mike  1.1.2.1 }
1367               
1368               void MemoryResidentRepository::deleteQualifier(
1369                   bool lock,
1370                   const CIMNamespaceName& nameSpace,
1371                   const CIMName& qualifierName)
1372               {
1373 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "deleteQualifier()"));
1374 mike  1.1.2.1 }
1375               
1376               Array<CIMQualifierDecl> MemoryResidentRepository::enumerateQualifiers(
1377                   bool lock,
1378                   const CIMNamespaceName& nameSpace)
1379               {
1380 mike  1.1.2.6     return _enumerateQualifiers(nameSpace);
1381 mike  1.1.2.1 }
1382               
1383               void MemoryResidentRepository::createNameSpace(
1384                   bool lock,
1385                   const CIMNamespaceName& nameSpace,
1386                   const NameSpaceAttributes& attributes)
1387               {
1388 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "createNameSpace()"));
1389 mike  1.1.2.1 }
1390               
1391               void MemoryResidentRepository::modifyNameSpace(
1392                   bool lock,
1393                   const CIMNamespaceName& nameSpace,
1394                   const NameSpaceAttributes& attributes)
1395               {
1396 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "modifyNameSpace()"));
1397 mike  1.1.2.1 }
1398               
1399               Array<CIMNamespaceName> MemoryResidentRepository::enumerateNameSpaces(
1400                   bool lock) const
1401               {
1402 mike  1.1.2.6     return _enumerateNameSpaces();
1403 mike  1.1.2.1 }
1404               
1405               void MemoryResidentRepository::deleteNameSpace(
1406                   bool lock,
1407                   const CIMNamespaceName& nameSpace)
1408               {
1409 mike  1.1.2.6     Throw((CIM_ERR_NOT_SUPPORTED, "deleteNameSpace()"));
1410 mike  1.1.2.1 }
1411               
1412               Boolean MemoryResidentRepository::getNameSpaceAttributes(
1413                   bool lock,
1414                   const CIMNamespaceName& nameSpace,
1415                   NameSpaceAttributes& attributes)
1416               {
1417                   attributes.clear();
1418                   return false;
1419               }
1420               
1421               void MemoryResidentRepository::setDeclContext(
1422                   bool lock,
1423                   RepositoryDeclContext* context)
1424               {
1425 mike  1.1.2.5     Throw((CIM_ERR_NOT_SUPPORTED, "setDeclContext()"));
1426 mike  1.1.2.1 }
1427               
1428               Boolean MemoryResidentRepository::isDefaultInstanceProvider(
1429                   bool lock)
1430               {
1431                   return true;
1432               }
1433               
1434               void MemoryResidentRepository::getSubClassNames(
1435                   bool lock,
1436                   const CIMNamespaceName& nameSpace,
1437                   const CIMName& className,
1438                   Boolean deepInheritance,
1439                   Array<CIMName>& subClassNames) const
1440               {
1441 mike  1.1.2.6     _getSubClassNames(nameSpace, className, deepInheritance, subClassNames);
1442 mike  1.1.2.1 }
1443               
1444               void MemoryResidentRepository::getSuperClassNames(
1445                   bool lock,
1446                   const CIMNamespaceName& nameSpace,
1447                   const CIMName& className,
1448                   Array<CIMName>& superClassNames) const
1449               {
1450 mike  1.1.2.6     _getSuperClassNames(nameSpace, className, superClassNames);
1451 mike  1.1.2.1 }
1452               
1453               Boolean MemoryResidentRepository::isRemoteNameSpace(
1454                   bool lock,
1455                   const CIMNamespaceName& nameSpace,
1456                   String& remoteInfo)
1457               {
1458                   return false;
1459               }
1460               
1461               #ifdef PEGASUS_DEBUG
1462               void MemoryResidentRepository::DisplayCacheStatistics(
1463                   bool lock)
1464               {
1465               }
1466               #endif
1467               
1468               Uint32 MemoryResidentRepository::_findInstance(
1469                   const CIMNamespaceName& nameSpace,
1470                   const CIMObjectPath& instanceName)
1471               {
1472 mike  1.1.2.1     for (Uint32 i = 0; i < _rep.size(); i++)
1473                   {
1474                       if (_rep[i].first == nameSpace &&
1475                           _rep[i].second.getPath() == instanceName)
1476                       {
1477                           return i;
1478                       }
1479                   }
1480               
1481                   return PEG_NOT_FOUND;
1482               }
1483               
1484 mike  1.1.2.4 void MemoryResidentRepository::installSaveCallback(
1485                   void (*handler)(const Buffer& buffer, void* data),
1486                   void * data)
1487 mike  1.1.2.3 {
1488 mike  1.1.2.4     _saveCallback = handler;
1489                   _saveData = data;
1490 mike  1.1.2.3 }
1491               
1492 mike  1.1.2.4 void MemoryResidentRepository::installLoadCallback(
1493                   void (*handler)(Buffer& buffer, void* data),
1494                   void * data)
1495 mike  1.1.2.3 {
1496 mike  1.1.2.4     _loadCallback = handler;
1497                   _loadData = data;
1498 mike  1.1.2.3 }
1499               
1500               void MemoryResidentRepository::_processSaveHandler()
1501               {
1502 mike  1.1.2.4     if (!_saveCallback)
1503 mike  1.1.2.3         return;
1504               
1505                   Buffer out;
1506               
1507                   for (Uint32 i = 0; i < _rep.size(); i++)
1508                   {
1509                       SerializeNameSpace(out, _rep[i].first);
1510                       SerializeInstance(out, _rep[i].second);
1511                   }
1512               
1513 mike  1.1.2.4     (*_saveCallback)(out, _saveData);
1514 mike  1.1.2.3 }
1515               
1516               void MemoryResidentRepository::_processLoadHandler()
1517               {
1518 mike  1.1.2.4     if (!_loadCallback)
1519 mike  1.1.2.3         return;
1520               
1521                   Buffer in;
1522 mike  1.1.2.4     (*_loadCallback)(in, _loadData);
1523 mike  1.1.2.3     size_t pos = 0;
1524               
1525                   while (pos != in.size())
1526                   {
1527                       CIMNamespaceName nameSpace;
1528               
1529                       if (DeserializeNameSpace(in, pos, nameSpace) != 0)
1530                           return;
1531               
1532                       CIMInstance cimInstance;
1533               
1534                       if (DeserializeInstance(in, pos, cimInstance) != 0)
1535                           return;
1536               
1537                       _rep.append(NamespaceInstancePair(nameSpace, cimInstance));
1538                   }
1539               }
1540               
1541 mike  1.1.2.7 Boolean MemoryResidentRepository::addNameSpace(const SchemaNameSpace* nameSpace)
1542 mike  1.1.2.6 {
1543                   if (!nameSpace)
1544                       return false;
1545               
1546                   if (_nameSpaceTableSize == _MAX_NAMESPACE_TABLE_SIZE)
1547                       return false;
1548               
1549                   if (_findNameSpace(nameSpace->name))
1550                       return false;
1551               
1552                   _nameSpaceTable[_nameSpaceTableSize++] = nameSpace;
1553               
1554                   return true;
1555               }
1556               
1557 mike  1.1.2.1 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2