Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

CdbSQLApiView.cc

Go to the documentation of this file.
00001 // File and Version Information:
00002 //      $Id: CdbSQLApiView.cc,v 1.2 2005/10/19 18:54:26 gapon Exp $
00003 
00004 /// The implementation of the CdbSQLApiView class.
00005 /**
00006   * @see CdbSQLApiView
00007   */
00008 #include "BaBar/BaBar.hh"
00009 
00010 #include "CdbSQL/CdbSQLApiView.hh"
00011 
00012 #include "CdbBase/Cdb.hh"
00013 #include "CdbBase/CdbId.hh"
00014 #include "CdbBase/CdbStateId.hh"
00015 #include "CdbBase/CdbFolder.hh"
00016 #include "CdbBase/CdbPathName.hh"
00017 #include "CdbBase/CdbRevisionPolicy.hh"
00018 #include "CdbBase/CdbVectorAdapterItr.hh"
00019 #include "CdbBase/CdbSimpleVectorAdapterItr.hh"
00020 
00021 #include "CdbSQL/CdbSQLOrigin.hh"
00022 #include "CdbSQL/CdbSQLPartition.hh"
00023 #include "CdbSQL/CdbSQLView.hh"
00024 #include "CdbSQL/CdbSQLFolder.hh"
00025 #include "CdbSQL/CdbSQLConditionAtFolder.hh"
00026 #include "CdbSQL/CdbSQLApiFolder.hh"
00027 
00028 #include <assert.h>
00029 
00030 #include <iostream>
00031 using std::cout;
00032 using std::endl;
00033 
00034 namespace {
00035 
00036   /////////////////////////////
00037   // Class IteratorOfFolders //
00038   /////////////////////////////
00039 
00040     class IteratorOfFolders : public CdbVectorAdapterItr< const char*, CdbCPtr<CdbSQLFolder> > {
00041 
00042     private:
00043 
00044       /// The default constructor (NOT IMPLEMENTED)
00045 
00046         IteratorOfFolders( );
00047 
00048       /// The assignment operator (NOT IMPLEMENTED)
00049 
00050         IteratorOfFolders& operator=( const IteratorOfFolders& );
00051 
00052     protected:
00053 
00054       /// The copy constructor
00055 
00056         IteratorOfFolders( const IteratorOfFolders& theItr ) :
00057             CdbVectorAdapterItr<const char*, CdbCPtr<CdbSQLFolder> >( theItr )
00058         { }
00059 
00060     public:
00061 
00062       /// The normal constructor
00063       /**
00064         * @see CdbVectorAdapterItr::CdbVectorAdapterItr()
00065         */
00066         IteratorOfFolders( const std::vector< CdbCPtr<CdbSQLFolder> >& theList ) :
00067             CdbVectorAdapterItr< const char*, CdbCPtr<CdbSQLFolder> >( theList )
00068         { }
00069 
00070       /// Make a clone of itself
00071       /**
00072         * @see CdbIItr::clone()
00073         */
00074         virtual CdbIItr<const char*>* clone( ) const
00075         {
00076             return new IteratorOfFolders( *this );
00077         }
00078 
00079     protected:
00080 
00081       /// User defined translation for the currently reffered value
00082       /**
00083         * @see CdbVectorAdapterItr::CdbVectorAdapterItr()
00084         */
00085         virtual const char* toValue( const CdbCPtr<CdbSQLFolder>& thePtr ) const
00086         {
00087             return thePtr->name( ).c_str( );
00088         }
00089     };
00090 }
00091 
00092 //////////////////////////////
00093 // Class: CdbSQLApiView //
00094 //////////////////////////////
00095 
00096 CdbView*
00097 CdbSQLApiView::clone( ) const
00098 {
00099   // Get rid of the "const" to access non-const methods
00100 
00101     CdbSQLApiView* mySelf = const_cast<CdbSQLApiView*>( this );
00102     return new CdbSQLApiView( mySelf->parent( ),
00103                               mySelf->name( ),
00104                               mySelf->id( ),
00105                               _mySQLViewPtr,
00106                               _myMasterSQLOriginPtr,
00107                               _myLocalSQLOriginPtr );
00108 }
00109 
00110 CdbSQLApiView::CdbSQLApiView( const CdbDatabasePtr&        thePtr,
00111                               const char*                  theName,
00112                               const CdbId&                 theId,
00113                               const CdbCPtr<CdbSQLView>&   theViewPtr,
00114                               const CdbCPtr<CdbSQLOrigin>& theMasterOriginPtr,
00115                               const CdbCPtr<CdbSQLOrigin>& theLocalOriginPtr ) :
00116     CdbView( thePtr,
00117              theName,
00118              theId ),
00119     _mySQLViewPtr        (theViewPtr),
00120     _myMasterSQLOriginPtr(theMasterOriginPtr),
00121     _myLocalSQLOriginPtr (theLocalOriginPtr)
00122 {
00123     assert( !_mySQLViewPtr.isNull( ));
00124     assert( !_myMasterSQLOriginPtr.isNull( ));
00125     assert( !_myLocalSQLOriginPtr.isNull( ));
00126 }
00127 
00128 CdbSQLApiView::~CdbSQLApiView( )
00129 { }
00130 
00131 bool
00132 CdbSQLApiView::isValid( )
00133 {
00134     return true;
00135 }
00136 
00137 bool
00138 CdbSQLApiView::isOpen( )
00139 {
00140     return true;
00141 }
00142 
00143 CdbStatus
00144 CdbSQLApiView::open( )
00145 {
00146     return CdbStatus::Success;
00147 }
00148 
00149 CdbStatus
00150 CdbSQLApiView::close( )
00151 {
00152     return CdbStatus::Success;
00153 }
00154 
00155 BdbTime
00156 CdbSQLApiView::minValidity( ) const
00157 {
00158     return _mySQLViewPtr->begin( );
00159 }
00160 
00161 BdbTime
00162 CdbSQLApiView::maxValidity( ) const
00163 {
00164     return _mySQLViewPtr->end( );
00165 }
00166 
00167 BdbTime
00168 CdbSQLApiView::created( ) const
00169 {
00170     return _mySQLViewPtr->created( );
00171 }
00172 
00173 std::string
00174 CdbSQLApiView::description( ) const
00175 {
00176     return _mySQLViewPtr->description( );
00177 }
00178 
00179 bool
00180 CdbSQLApiView::hasDefaultConfig( ) const
00181 {
00182     return _mySQLViewPtr->hasDefaultConfig( );
00183 }
00184 
00185 bool
00186 CdbSQLApiView::isLocal( ) const
00187 {
00188     return id( ).origin == _myLocalSQLOriginPtr->id( );
00189 }
00190 
00191 bool 
00192 CdbSQLApiView::isFrozen( ) const
00193 {
00194     return _mySQLViewPtr->isFrozen( );
00195 }
00196 
00197 CdbStatus
00198 CdbSQLApiView::findFolder( CdbFolderPtr& thePtr,
00199                                const char*   theName )
00200 {
00201     CdbStatus status = CdbStatus::Error;
00202 
00203   // Only the "root" folder is allowed
00204 
00205     if( std::string( theName ) != CdbPathName::separator( )) {
00206 
00207         cout << "CdbSQLApiView::findFolder() -- ERROR" << endl
00208              << "    No such folder in this implementation: \"" << theName                   << "\"" << endl
00209              << "    The only name allowed is the rood one: \"" << CdbPathName::separator( ) << "\"" << endl;
00210 
00211         return CdbStatus::Error;
00212     }
00213 
00214   // Find out persistent folder for specified name
00215 
00216     CdbCPtr<CdbSQLFolder> folderPtr;
00217     if( CdbStatus::Success != ( status = _mySQLViewPtr->find_folder( folderPtr,
00218                                                                      std::string( theName )))) {
00219         return status;
00220     }
00221 
00222   // Construct a transient CDB API object
00223 
00224     CdbFolderPtr parentFolderPtr = 0;       // the root folder is not supposed to have a parent
00225 
00226     thePtr = new CdbSQLApiFolder( CdbViewPtr( this->clone( )),
00227                                   parentFolderPtr,
00228                                   theName,
00229                                   folderPtr,
00230                                   _myMasterSQLOriginPtr,
00231                                   _myLocalSQLOriginPtr );
00232     return CdbStatus::Success;
00233 }
00234 
00235 CdbStatus
00236 CdbSQLApiView::folderIterator( CdbFolderItr& theItr )
00237 {
00238     const char* errorStr = "CdbSQLApiView::folderIterator() -- ERROR.";
00239 
00240     CdbStatus status = CdbStatus::Error;
00241 
00242   // Find all folders in the scope of the pesistent view
00243 
00244     std::vector< CdbCPtr<CdbSQLFolder> > folders;
00245     if( CdbStatus::Success != ( status = _mySQLViewPtr->folders( folders ))) {
00246         cout << errorStr << endl
00247              << "    Failed to obtain a list of folders at the view." << endl
00248              << "        VIEW NAME : \"" << name( ) << "\"." << endl;
00249         return status;
00250     }
00251     theItr = CdbFolderItr( new IteratorOfFolders( folders ));
00252 
00253     return CdbStatus::Success;
00254 }
00255 
00256 CdbStatus
00257 CdbSQLApiView::getDefault( const BdbTime&    theValidityTime,
00258                                CdbConfigElement& theConfigElement ) const
00259 {
00260     return CdbStatus::NotImplemented;
00261 }
00262 
00263 CdbStatus
00264 CdbSQLApiView::defaultConfigIterator( CdbItr<CdbConfigElement>& theItr ) const
00265 {
00266     return CdbStatus::NotImplemented;
00267 }
00268 
00269 CdbStatus
00270 CdbSQLApiView::get( const char*       theName,
00271                     const BdbTime&    theValidityTime,
00272                     CdbConfigElement& theConfigElement ) const
00273 {
00274     const char* errorStr = "CdbSQLApiView::get() -- ERROR.";
00275 
00276     CdbStatus status = CdbStatus::Error;
00277 
00278   // Verify the condition path name.
00279 
00280     if( 0 == theName ) {
00281         cout << errorStr << endl
00282              << "    Non 0 pointer onto a fully qualified condition path name was expected." << endl;
00283         return CdbStatus::IllegalParameters;
00284     }
00285 
00286     CdbPathName fullPath( theName );
00287 
00288     if( ! ( fullPath.isValid( ) &&
00289             fullPath.isAbsolute( ) &&
00290             fullPath.isComposite( ))) {
00291 
00292         cout << errorStr << endl
00293              << "    Unsupported format of the condition name. Fully qualified" << endl
00294              << "    condition name including its folder path was expected." << endl
00295              << "        Passed condition name: \"" << theName << "\"" << endl;
00296         return CdbStatus::IllegalParameters;
00297     }
00298 
00299   // Check if specified time fits into the validity interval covered by
00300   // the current view.
00301 
00302     if(( theValidityTime <  _mySQLViewPtr->begin( )) ||
00303        ( theValidityTime >= _mySQLViewPtr->end( ))) {
00304 
00305         cout << errorStr << endl
00306              << "    The pased validity time is out of the validity interval covered" << endl
00307              << "    by the current view." << endl
00308              << "        Passed  validity time: " << theValidityTime << endl
00309              << "        Minimum validity time: " << _mySQLViewPtr->begin( ) << endl
00310              << "        Maximum validity time: " << _mySQLViewPtr->end( ) << endl;
00311         return CdbStatus::IllegalParameters;
00312     }
00313 
00314   // First we're going to see if specified condition has its own revision
00315   // configuration. This always superseeds the default configuration at
00316   // the level of the view.
00317 
00318     CdbConfigElement configElement;
00319     {
00320         std::string folderName    = fullPath.beforeLast( ).toString( );
00321         std::string conditionName = fullPath.last( ).toString( );
00322 
00323       // Find the parent folder first
00324 
00325         CdbCPtr<CdbSQLFolder> folderPtr;
00326         if( CdbStatus::Success != ( status = _mySQLViewPtr->find_folder( folderPtr,
00327                                                                          folderName ))) {
00328             return status;
00329         }
00330 
00331       // Then find the condition
00332 
00333         CdbCPtr<CdbSQLConditionAtFolder> conditionPtr;
00334         if( CdbStatus::Success != ( status = folderPtr->find_condition( conditionPtr,
00335                                                                         conditionName ))) {
00336             return status;
00337         }
00338 
00339       // Proceed to the configuration element
00340 
00341         status = conditionPtr->find_config_element( configElement,
00342                                                     theValidityTime );
00343         if( CdbStatus::Success != status ) {
00344             if( CdbStatus::NotFound == status ) {
00345 
00346               // No configuration found at the conditin level. Get the default
00347               // configuration at the view level then.
00348 
00349                 if( CdbStatus::Success != _mySQLViewPtr->find_config_element( configElement,
00350                                                                               theValidityTime )) {
00351                     cout << errorStr << endl
00352                          << "    The current view is inproperly configured for specified condition." << endl
00353                          << "    No configuration found both at specified condition scope and" << endl
00354                          << "    at the view level." << endl
00355                          << "        Current view name:     \"" << name( ) << "\"" << endl
00356                          << "        Passed condition name: \"" << theName << "\"" << endl;
00357                     return status;
00358                 }
00359 
00360             } else {
00361                 cout << errorStr << endl
00362                      << "    A problem occured while attempting to get a configuration." << endl
00363                      << "    No configuration found both at specified condition scope and" << endl
00364                      << "    at the view level." << endl
00365                      << "        Current view name:     \"" << name( ) << "\"" << endl
00366                      << "        Passed condition name: \"" << theName << "\"" << endl;
00367                 return status;
00368             }
00369         }
00370     }
00371     theConfigElement = configElement;
00372 
00373     return CdbStatus::Success;
00374 }
00375 
00376 CdbStatus
00377 CdbSQLApiView::configIterator( const char*               theName,
00378                                CdbItr<CdbConfigElement>& theItr ) const
00379 {
00380     const char* errorStr = "CdbSQLApiView::configIterator() -- ERROR.";
00381 
00382     CdbStatus status = CdbStatus::Error;
00383 
00384   // Verify the condition path name.
00385 
00386     if( 0 == theName ) {
00387         cout << errorStr << endl
00388              << "    Non 0 pointer onto a fully qualified condition path name was expected." << endl;
00389         return CdbStatus::IllegalParameters;
00390     }
00391 
00392     CdbPathName fullPath( theName );
00393 
00394     if( ! ( fullPath.isValid( ) &&
00395             fullPath.isAbsolute( ) &&
00396             fullPath.isComposite( ))) {
00397 
00398         cout << errorStr << endl
00399              << "    Unsupported format of the condition name. Fully qualified" << endl
00400              << "    condition name including its folder path was expected." << endl
00401              << "        Passed condition name: \"" << theName << "\"" << endl;
00402         return CdbStatus::IllegalParameters;
00403     }
00404 
00405   // First we're going to see if specified condition has  its own revision
00406   // configuration. This always superseeds the default configuration at
00407   // the level of the view.
00408 
00409     std::vector<CdbConfigElement> config_elements;
00410     {
00411         std::string folderName    = fullPath.beforeLast( ).toString( );
00412         std::string conditionName = fullPath.last( ).toString( );
00413 
00414       // Find the parent folder first
00415 
00416         CdbCPtr<CdbSQLFolder> folderPtr;
00417         if( CdbStatus::Success != ( status = _mySQLViewPtr->find_folder( folderPtr,
00418                                                                          folderName ))) {
00419             return status;
00420         }
00421 
00422       // Then find the condition
00423 
00424         CdbCPtr<CdbSQLConditionAtFolder> conditionPtr;
00425         if( CdbStatus::Success != ( status = folderPtr->find_condition( conditionPtr,
00426                                                                         conditionName ))) {
00427             return status;
00428         }
00429 
00430       // Then proceed to configuration elements
00431 
00432         status = conditionPtr->config_elements( config_elements );
00433 
00434         if( CdbStatus::Success != status ) {
00435             if( CdbStatus::NotFound == status ) {
00436 
00437               // No configuration found at the conditin level. Get the default
00438               // configuration at the view level then.
00439 
00440                 if( CdbStatus::Success != ( status = _mySQLViewPtr->config_elements( config_elements ))) {
00441                     cout << errorStr << endl
00442                          << "    The current view is inproperly configured for specified condition." << endl
00443                          << "    No configuration found both at specified condition scope and" << endl
00444                          << "    at the view level." << endl
00445                          << "        Current view name:     \"" << name( ) << "\"" << endl
00446                          << "        Passed condition name: \"" << theName << "\"" << endl;
00447                     return status;
00448                 }
00449 
00450             } else {
00451                 cout << errorStr << endl
00452                      << "    A problem occured while attempting to get a configuration." << endl
00453                      << "    No configuration found both at specified condition scope and" << endl
00454                      << "    at the view level." << endl
00455                      << "        Current view name:     \"" << name( ) << "\"" << endl
00456                      << "        Passed condition name: \"" << theName << "\"" << endl;
00457                 return status;
00458             }
00459         }
00460     }
00461 
00462   // Fill up 'holes' in the validity timeline if the above found list doesn't cover
00463   // the whole timeline.
00464 
00465     std::vector<CdbConfigElement> adjusted_config_elements;
00466     {
00467         BdbTime prevEnd = BdbTime::minusInfinity;
00468 
00469         for( std::vector<CdbConfigElement>::const_iterator itr = config_elements.begin();
00470                                                            itr != config_elements.end();
00471                                                          ++itr ) {
00472             if( prevEnd < itr->begin )
00473                 adjusted_config_elements.push_back( CdbConfigElement( prevEnd,
00474                                                                       itr->begin ));
00475             adjusted_config_elements.push_back( *itr );
00476             prevEnd = itr->end;
00477         }
00478         if( prevEnd < BdbTime::plusInfinity )
00479             adjusted_config_elements.push_back( CdbConfigElement( prevEnd,
00480                                                                   BdbTime::plusInfinity ));
00481     }
00482     theItr = CdbItr<CdbConfigElement>( new CdbSimpleVectorAdapterItr<CdbConfigElement>( adjusted_config_elements ));
00483 
00484     return CdbStatus::Success;
00485 }
00486 
00487 CdbStateId
00488 CdbSQLApiView::currentStateId( const BdbTime& theValidityTime ) const
00489 {
00490     const char* errorStr = "CdbSQLApiView::currentStateId() -- ERROR.";
00491 
00492     CdbStateId result;  // REMEMBER: default value of the State ID is invalid
00493     do {
00494 
00495       // _________________________________________________________________________________
00496       // The algorithm desctiption below has been copied from its original implementation
00497       // in the "Shared" implementation of the "Bdb" technology. See the implementation of
00498       // the correponding method for more details.
00499       //
00500       // @see CdbBdbSView::currentStateId()
00501       //
00502       // _______________________________________________________________________
00503       // Find out a 'topmost' partition corresponding to specified validity time
00504       // and obtain its modification time.
00505       //
00506       // NOTE: The logic implemented by the current code is slightly different from
00507       //       the one found in previous implementations. Here are the differences:
00508       //
00509       //       (1) The previous implementations used _current_ wall-clock time if
00510       //           a 'closed' partition was found. The new logic will always use
00511       //           the modification time.
00512       //
00513       //           [ That older logic didn't seem right from the optimization point of view
00514       //             since the actual _meaning_ of StateId-s does not change with wall-clock
00515       //             time for closed partition. In this case an identifier of a views
00516       //             alone stored as a part of the StateId provides full description of
00517       //             the same state of CDB. ]
00518       //
00519       //       (2) Another tiny change in the logic is related to so called "non-instantiated"
00520       //           partition not owned by the current CDB. This transitional scenario is quite
00521       //           normal in a distributed CDB when a remote origin has not delivered its
00522       //           instance of a known to MASTER partition (unless this instance is supposed
00523       //           to belong to the current 'origin'. Having a non-instantiated partition
00524       //           belonging to  the current 'origin' is supposed to be a CDB initialization
00525       //           error.). When this transition scenario is detected the creation time of the
00526       //           partition (in fact - the 'bottom' of the partition in the modification
00527       //           time dimension) will be put into the StateID.
00528       //
00529       //       (3) The current wall-clock time will only be used if no partition will be
00530       //           found for the specified validity time. It's quite an unusual situation
00531       //           meaning that 'partitionable' conditions are not in use at all.
00532       //
00533       // If the found partition is still not 'closed' (is 'under construction')
00534       // and if the current database is not the MASTER one and (finally :-)) if found
00535       // partition belongs to the local database then we should switch to the local
00536       // partition object. Then we'll have the most 'up-to-date' information about
00537       // the modification time of that partition.
00538       //
00539       // This kind of logic will not only provide us with the 'up-to-date' modification
00540       // time of a partition in its owner database, but will also ensure the correctness
00541       // of its ('modification time') in other databases.
00542       //
00543       // NOTE: The modification time as a way to refine the current state of the database
00544       //       _ONLY_ makes sense for the 'partitionable' conditions. In case of 'regular'
00545       //       conditions one should rely on the regular revisions mechanizm (sufficiently 
00546       //       supported by views)  to acheive the reproducability of the database contents.
00547 
00548         BdbTime partitionModificationTime( BdbTime::now( ));    // _current_ time by default
00549         {
00550           // NOTE: The following operation will look for an 'topmost' partition at
00551           //       at the MASTER registry.
00552 
00553             CdbCPtr<CdbSQLPartition> partitionPtr;
00554             if( CdbStatus::Success == _myMasterSQLOriginPtr->find_topmost_partition( partitionPtr,
00555                                                                                      theValidityTime )) {
00556 
00557               // Refine which partition object to use
00558 
00559                 if( !partitionPtr->isClosed( )) {
00560 
00561                   // Switch from the MASTER partition to the local one if needed, which
00562                   // is going to happen in a case when the found partition belongs to
00563                   // the local 'origin'.
00564 
00565                     if( _myMasterSQLOriginPtr->id( ) != _myLocalSQLOriginPtr->id( )) {
00566                         if( _myLocalSQLOriginPtr->id( ) == partitionPtr->originId( )) {
00567 
00568                           // Since we're switching to the final partition then we have one extra requirement
00569                           // to this partition - it must exist.
00570                           //
00571                           // NOTE: Unlike the previous step when we're looking for the preliminary information
00572                           //       about the partition now we also need to find 'closed' partitions
00573                           //       This is why we're looking this partition by it's ID, not requering
00574                           //       its "openness".
00575 
00576                             if( CdbStatus::Success != _myLocalSQLOriginPtr->find_partition( partitionPtr,
00577                                                                                             partitionPtr->id( ))) {
00578                                 cout << errorStr << endl
00579                                      << "    Failed to locate a final partition with ID=" << partitionPtr->id( ) << endl
00580                                      << "    at the local database where it's supposed to belong to." << endl
00581                                      << "    The local database may not be properly initialized/loaded." << endl;
00582                                 break;
00583                             }
00584                         }
00585                     }
00586                 }
00587 
00588               // Check one more time if that partition is in the 'open' state because
00589               // the previous step was switch us to the final partition owned
00590               // by the current SLAVE database. Therefore the information we're looking
00591               // for must be 'up-to-date'.
00592 
00593                 if( partitionPtr->isClosed( )) {
00594 
00595                   // Get the modification time of the 'closed' partition. It will correspond
00596                   // to the time when the partition was closed.
00597 
00598                     partitionModificationTime = partitionPtr->modified( );
00599 
00600                 } else {
00601 
00602                   // The non-local partition is allowed to be not instantiated since
00603                   // its owner database may not have delivered the corresponding updated version of it.
00604                   //
00605                   // Otherwise we treat the non-instantiated partition as a database inconsistency problem...
00606 
00607                     if( partitionPtr->isInstantiated( )) {
00608                         partitionModificationTime = partitionPtr->modified( );
00609                     } else {
00610                         if( _myLocalSQLOriginPtr->id( ) == partitionPtr->originId( )) {
00611                             cout << errorStr << endl
00612                                  << "    The partition with ID=" << partitionPtr->id( ) << " corresponding to the following" << endl
00613                                  << "    validity time: " << theValidityTime << endl
00614                                  << "    belonging to the local database is not properly instantiated." << endl
00615                                  << "    The local database may not be properly initialized/loaded." << endl;
00616                             break;
00617 
00618                         } else {
00619 
00620                           // This is pretty normal 'transitional' situation - a remote database has
00621                           // not delivered its instantiated partition yet. Therefore we don't know yet
00622                           // when the partition was modified. So we just go along with 'creation' time
00623                           // of the partition. This 'creation' time represents the 'bottom' of the partition
00624                           // in the modification timeline. It will guarantee that we'll be relying on
00625                           // the values of 'partitionable' conditions stored _before_ the found partition.
00626 
00627                             partitionModificationTime = partitionPtr->created( );
00628                         }
00629                     }
00630                 }
00631             }
00632         }
00633 
00634       // Build the valid state identifier
00635 
00636         result = CdbStateId( id( ), partitionModificationTime );
00637 
00638     } while( false );
00639 
00640     return result;
00641 }
00642 
00643 CdbStatus
00644 CdbSQLApiView::historyEventIterator( CdbHistoryEventItr& theItr,
00645                                      const BdbTime&      theBeginTime,
00646                                      const BdbTime&      theEndTime,
00647                                      const char**        theEventsToSelect )
00648 {
00649     return CdbStatus::NotImplemented;
00650 }
00651 
00652 CdbStatus
00653 CdbSQLApiView::historyEventTypeIterator( CdbHistoryEventTypeItr& theItr )
00654 {
00655     return CdbStatus::NotImplemented;
00656 }
00657 
00658 /////////////////
00659 // End Of File //
00660 /////////////////

Generated on Mon Dec 5 18:22:12 2005 for CDB by doxygen1.3-rc3