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;
00055 friend ostream& operator<<(ostream& s, const DbiCascader& cascader);
00056
00057 public:
00058
00059 enum Status { kFailed, kClosed, kOpen };
00060
00061
00062
00063
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
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
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
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
00115 DbiCascader();
00116 virtual ~DbiCascader();
00117 DbiCascader(const DbiCascader&);
00118
00119
00120
00122 Int_t fGlobalSeqNoDbNo;
00123
00125 vector<DbiConnection*> fConnections;
00126
00128 std::map<string,Int_t> fTemporaryTables;
00129
00130
00131
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;
00146 string fSeqnoTableName;
00147 string fDataTableName;
00148 Bool_t fLocked;
00149
00150 };
00151
00152
00153
00154 };
00155
00156
00157 #endif // DBISKEL_H