Main Page | Class Hierarchy | Class List | File List | Class Members

collection.h

00001 /*********************************************************************
00002  *
00003  * Condor ClassAd library
00004  * Copyright (C) 1990-2003, Condor Team, Computer Sciences Department,
00005  * University of Wisconsin-Madison, WI and Rajesh Raman.
00006  *
00007  * This source code is covered by the Condor Public License, which can
00008  * be found in the accompanying LICENSE file, or online at
00009  * www.condorproject.org.
00010  *
00011  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00012  * AND THE UNIVERSITY OF WISCONSIN-MADISON "AS IS" AND ANY EXPRESS OR
00013  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00014  * WARRANTIES OF MERCHANTABILITY, OF SATISFACTORY QUALITY, AND FITNESS
00015  * FOR A PARTICULAR PURPOSE OR USE ARE DISCLAIMED. THE COPYRIGHT
00016  * HOLDERS AND CONTRIBUTORS AND THE UNIVERSITY OF WISCONSIN-MADISON
00017  * MAKE NO MAKE NO REPRESENTATION THAT THE SOFTWARE, MODIFICATIONS,
00018  * ENHANCEMENTS OR DERIVATIVE WORKS THEREOF, WILL NOT INFRINGE ANY
00019  * PATENT, COPYRIGHT, TRADEMARK, TRADE SECRET OR OTHER PROPRIETARY
00020  * RIGHT.
00021  *
00022  *********************************************************************/
00023 
00024 #ifndef __COLLECTION_H__
00025 #define __COLLECTION_H__
00026 
00027 #include "view.h"
00028 #include "source.h"
00029 #include "sink.h"
00030 
00031 BEGIN_NAMESPACE( classad )
00032 
00033 
00034 class ClassAdCollectionInterface {
00035 public:
00036         ClassAdCollectionInterface( );
00037         virtual ~ClassAdCollectionInterface( );
00038 
00039         enum {
00040             ClassAdCollOp_NoOp                  = 10000,
00041 
00042                 __ClassAdCollOp_ViewOps_Begin__,
00043                 ClassAdCollOp_CreateSubView         = __ClassAdCollOp_ViewOps_Begin__,
00044                 ClassAdCollOp_CreatePartition       ,
00045                 ClassAdCollOp_DeleteView            ,
00046                 ClassAdCollOp_SetViewInfo           ,
00047                 ClassAdCollOp_AckViewOp             ,
00048                 __ClassAdCollOp_ViewOps_End__       = ClassAdCollOp_AckViewOp,
00049 
00050                 __ClassAdCollOp_ClassAdOps_Begin__,
00051                 ClassAdCollOp_AddClassAd            =__ClassAdCollOp_ClassAdOps_Begin__,
00052                 ClassAdCollOp_UpdateClassAd         ,
00053                 ClassAdCollOp_ModifyClassAd         ,
00054                 ClassAdCollOp_RemoveClassAd         ,
00055                 ClassAdCollOp_AckClassAdOp          ,
00056                 __ClassAdCollOp_ClassAdOps_End__    = ClassAdCollOp_AckClassAdOp,
00057 
00058                 __ClassAdCollOp_XactionOps_Begin__,
00059                 ClassAdCollOp_OpenTransaction       =__ClassAdCollOp_XactionOps_Begin__,
00060                 ClassAdCollOp_AckOpenTransaction    ,
00061                 ClassAdCollOp_CommitTransaction     ,
00062                 ClassAdCollOp_AbortTransaction      ,
00063                 ClassAdCollOp_AckCommitTransaction  ,
00064                 ClassAdCollOp_ForgetTransaction     ,
00065                 __ClassAdCollOp_XactionOps_End__    = ClassAdCollOp_ForgetTransaction,
00066 
00067                 __ClassAdCollOp_ReadOps_Begin__     ,
00068                 ClassAdCollOp_GetClassAd            = __ClassAdCollOp_ReadOps_Begin__,
00069                 ClassAdCollOp_GetViewInfo           ,
00070                 ClassAdCollOp_GetSubordinateViewNames,
00071                 ClassAdCollOp_GetPartitionedViewNames,
00072                 ClassAdCollOp_FindPartitionName     ,
00073                 ClassAdCollOp_IsActiveTransaction   ,
00074                 ClassAdCollOp_IsCommittedTransaction,
00075                 ClassAdCollOp_GetAllActiveTransactions,
00076                 ClassAdCollOp_GetAllCommittedTransactions,
00077                 ClassAdCollOp_GetServerTransactionState,
00078                 ClassAdCollOp_AckReadOp             ,
00079                 __ClassAdCollOp_ReadOps_End__       = ClassAdCollOp_AckReadOp,
00080 
00081                 __ClassAdCollOp_MiscOps_Begin__     ,
00082                 ClassAdCollOp_Connect               = __ClassAdCollOp_MiscOps_Begin__,
00083                 ClassAdCollOp_QueryView             ,
00084                 ClassAdCollOp_Disconnect            ,
00085             __ClassAdCollOp_MiscOps_End__       = ClassAdCollOp_Disconnect,
00086                 ClassAdCollOp_CheckPoint
00087         };
00088 
00089         static const char * const CollOpStrings[];
00090 
00091         enum AckMode { _DEFAULT_ACK_MODE, WANT_ACKS, DONT_WANT_ACKS };
00092 
00093                 // outcome from a commit
00094         enum { XACTION_ABORTED, XACTION_COMMITTED, XACTION_UNKNOWN };
00095 
00096         // Logfile control
00097         virtual bool InitializeFromLog( const std::string &filename,
00098                                                                         const std::string storagefile="", 
00099                                                                         const std::string checkpointfile="" ) = 0;
00100         bool TruncateLog( );
00101 
00102 
00103                 // View creation/deletion/interrogation
00104         virtual bool CreateSubView( const ViewName &viewName,
00105                                 const ViewName &parentViewName,
00106                                 const std::string &constraint, const std::string &rank,
00107                                 const std::string &partitionExprs ) = 0;
00108         virtual bool CreatePartition( const ViewName &viewName,
00109                                 const ViewName &parentViewName,
00110                                 const std::string &constraint, const std::string &rank,
00111                                 const std::string &partitionExprs, ClassAd *rep ) = 0;
00112         virtual bool DeleteView( const ViewName &viewName ) = 0;
00113         virtual bool SetViewInfo( const ViewName &viewName, 
00114                                 const std::string &constraint, const std::string &rank, 
00115                                 const std::string &partitionAttrs ) = 0;
00116         virtual bool GetViewInfo( const ViewName &viewName, ClassAd *&viewInfo )=0;
00117                 // Child view interrogation
00118         virtual bool GetSubordinateViewNames( const ViewName &viewName,
00119                                 std::vector<std::string>& views ) = 0;
00120         virtual bool GetPartitionedViewNames( const ViewName &viewName,
00121                                 std::vector<std::string>& views ) = 0;
00122         virtual bool FindPartitionName( const ViewName &viewName, ClassAd *rep, 
00123                                 ViewName &partition ) = 0;
00124 
00125 
00126                 // ClassAd manipulation 
00127         virtual bool AddClassAd( const std::string &key, ClassAd *newAd ) = 0;
00128         virtual bool UpdateClassAd( const std::string &key, ClassAd *updateAd ) = 0;
00129         virtual bool ModifyClassAd( const std::string &key, ClassAd *modifyAd ) = 0;
00130         virtual bool RemoveClassAd( const std::string &key ) = 0;
00131         virtual ClassAd *GetClassAd(const std::string &key ) = 0;
00132 
00133 
00134                 // Mode management
00135         bool SetAcknowledgementMode( AckMode );
00136         AckMode GetAcknowledgementMode( ) const { return( amode ); }
00137 
00138 
00139                 // Transaction management
00140         virtual bool OpenTransaction( const std::string &xactionName) = 0;
00141         bool SetCurrentTransaction( const std::string &xactionName );
00142         void GetCurrentTransaction( std::string &xactionName ) const;
00143         virtual bool CloseTransaction( const std::string &xactionName, bool commit,
00144                                 int &outcome )=0;
00145 
00146         virtual bool IsMyActiveTransaction( const std::string &xactionName ) = 0;
00147         virtual void GetMyActiveTransactions( std::vector<std::string>& ) = 0;
00148         virtual bool IsActiveTransaction( const std::string &xactionName ) = 0;
00149         virtual bool GetAllActiveTransactions( std::vector<std::string>& ) = 0;
00150         virtual bool IsCommittedTransaction( const std::string &xactionName ) = 0;
00151         virtual bool GetAllCommittedTransactions( std::vector<std::string>& ) = 0;
00152 
00153 
00154                 // misc
00155         static inline const char *GetOpString( int op ) {
00156                 return( op>=ClassAdCollOp_NoOp && op<=__ClassAdCollOp_MiscOps_End__ ? 
00157                                 CollOpStrings[op-ClassAdCollOp_NoOp] : "(unknown)" );
00158         }
00159 
00160 protected:
00161                 // Utility functions to make collection log records
00162         ClassAd *_CreateSubView( const ViewName &viewName,
00163                                 const ViewName &parentViewName,
00164                                 const std::string &constraint, const std::string &rank,
00165                                 const std::string &partitionExprs );
00166         ClassAd *_CreatePartition( const ViewName &viewName,
00167                                 const ViewName &parentViewName,
00168                                 const std::string &constraint, const std::string &rank,
00169                                 const std::string &partitionExprs, ClassAd *rep );
00170         ClassAd *_DeleteView( const ViewName &viewName );
00171         ClassAd *_SetViewInfo( const ViewName &viewName, 
00172                                 const std::string &constraint, const std::string &rank, 
00173                                 const std::string &partitionAttrs );
00174         ClassAd *_AddClassAd( const std::string &xactionName, 
00175                                 const std::string &key, ClassAd *newAd );
00176         ClassAd *_UpdateClassAd( const std::string &xactionName, 
00177                                 const std::string &key, ClassAd *updateAd );
00178         ClassAd *_ModifyClassAd( const std::string &xactionName, 
00179                                 const std::string &key, ClassAd *modifyAd );
00180         ClassAd *_RemoveClassAd( const std::string &xactionName,
00181                                 const std::string &key );
00182 
00183                 // mode management data
00184         AckMode                 amode;
00185         std::string             currentXactionName;
00186 
00187                 // function which executes log records in recovery mode
00188         virtual bool OperateInRecoveryMode( ClassAd* ) = 0;
00189 
00190                 // utility functions to operate on logs and log metadata
00191         ClassAd                 *ReadLogEntry( FILE * );
00192         bool                    WriteLogEntry( FILE *, ClassAd *, bool sync=true );
00193         bool                    ReadLogFile( );
00194         std::string             logFileName;
00195         ClassAdParser   parser;
00196         ClassAdUnParser unparser;
00197         FILE                    *log_fp;
00198 
00199         std::string                  StorageFileName;
00200         int                     sfiled;
00201                 // override for client and server
00202         virtual bool LogState( FILE * ) = 0;
00203 
00204 private:
00205     ClassAdCollectionInterface(const ClassAdCollectionInterface &i)            { return;       }
00206     ClassAdCollectionInterface &operator=(const ClassAdCollectionInterface &i) { return *this; }
00207 };
00208 
00209 
00210 END_NAMESPACE
00211 
00212 #endif