/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 00002 #ifndef DBICASCADER_H 00003 #define DBICASCADER_H 00004 00005 00009 00033 #include <map> 00034 #include <ostream> 00035 using std::ostream; 00036 #include <string> 00037 using std::string; 00038 #include <vector> 00039 using std::vector; 00040 00041 #if !defined(__CINT__) || defined(__MAKECINT__) 00042 #include "Rtypes.h" 00043 #endif 00044 00045 #include "DatabaseInterface/DbiConnection.h" 00046 #include "DatabaseInterface/DbiStatement.h" 00047 00048 class DbiCascader; 00049 class TSQL_Statement; 00050 00051 class DbiCascader 00052 { 00053 00054 friend class DbiTableProxyRegistry; //Only it can create 00055 friend ostream& operator<<(ostream& s, const DbiCascader& cascader); 00056 00057 public: 00058 00059 enum Status { kFailed, kClosed, kOpen }; 00060 00061 // State testing member functions 00062 00063 // Cascade entry-specific getters. 00064 00066 DbiStatement* CreateStatement(UInt_t dbNo) const; 00067 00069 const DbiConnection* 00070 GetConnection(UInt_t dbNo) const; 00071 DbiConnection* 00072 GetConnection(UInt_t dbNo) ; 00073 00074 string GetDbName(UInt_t dbNo) const; 00075 Int_t GetDbNo(const string& dbName) const; 00076 Int_t GetStatus(UInt_t dbNo) const { 00077 if ( dbNo >= GetNumDb() || ! fConnections[dbNo] ) return kFailed; 00078 return fConnections[dbNo]->IsClosed() ? kClosed : kOpen; } 00079 string GetStatusAsString(UInt_t dbNo) const ; 00080 string GetURL(UInt_t dbNo) const { 00081 return ( dbNo < GetNumDb() ) ? fConnections[dbNo]-> GetUrl(): ""; } 00082 Bool_t IsTemporaryTable(const string& tableName, 00083 Int_t dbNo) const; 00084 // Cascade-wide getters. 00085 00086 Int_t AllocateSeqNo(const string& tableName, 00087 Int_t requireGlobal = 0, 00088 Int_t dbNo = 0) const; 00089 Int_t GetAuthorisingDbNo() const { return fGlobalSeqNoDbNo; } 00090 UInt_t GetNumDb() const {return fConnections.size();} 00091 Int_t GetTableDbNo(const string& tableName, Int_t selectDbNo = -1) const; 00092 Bool_t TableExists(const string& tableName, Int_t selectDbNo = -1) const { 00093 return this->GetTableDbNo(tableName,selectDbNo) >= 0; } 00094 00095 // State changing member functions 00096 00097 Int_t CreateTemporaryTable(const string& tableName, 00098 const string& tableDescr); 00099 void HoldConnections(); 00100 void ReleaseConnections(); 00101 void SetPermanent(UInt_t dbNo); 00102 00103 // NJT: Make this public. 00104 void SetAuthorisingEntry(Int_t entry) {fGlobalSeqNoDbNo = entry;} 00105 00106 protected: 00107 00108 private: 00109 00110 Int_t ReserveNextSeqNo(const string& tableName, 00111 Bool_t isGlobal, 00112 UInt_t dbNo) const; 00113 00114 // Constructors and destructors. 00115 DbiCascader(); 00116 virtual ~DbiCascader(); 00117 DbiCascader(const DbiCascader&); // Not implemented 00118 00119 // Data members 00120 00122 Int_t fGlobalSeqNoDbNo; 00123 00125 vector<DbiConnection*> fConnections; 00126 00128 std::map<string,Int_t> fTemporaryTables; 00129 00130 00131 // Private Locker object 00132 00133 class Lock { 00134 00135 public: 00136 Lock(DbiStatement* stmtDB, const string& seqnoTable, const string& dataTable); 00137 ~Lock(); 00138 00139 Bool_t IsLocked() const { return fLocked; } 00140 00141 private: 00142 00143 void SetLock(Bool_t setting = kTRUE); 00144 00145 DbiStatement* fStmt; // Statement to be used to issue lock 00146 string fSeqnoTableName; // The SEQNO table that is locked 00147 string fDataTableName; // The data table that is locked 00148 Bool_t fLocked; // Lock status 00149 00150 }; 00151 00152 // Removed: ClassDef(DbiCascader,0) //A cascade of DbiConnectionss 00153 00154 }; 00155 00156 00157 #endif // DBISKEL_H