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 friend class DbiValidate;
00060
00061 enum Status { kFailed, kClosed, kOpen };
00062
00063
00064
00065
00066
00068 DbiStatement* CreateStatement(UInt_t dbNo) const;
00069
00071 const DbiConnection*
00072 GetConnection(UInt_t dbNo) const;
00073 DbiConnection*
00074 GetConnection(UInt_t dbNo) ;
00075
00076 string GetDbName(UInt_t dbNo) const;
00077 Int_t GetDbNo(const string& dbName) const;
00078 Int_t GetStatus(UInt_t dbNo) const {
00079 if ( dbNo >= GetNumDb() || ! fConnections[dbNo] ) return kFailed;
00080 return fConnections[dbNo]->IsClosed() ? kClosed : kOpen; }
00081 string GetStatusAsString(UInt_t dbNo) const ;
00082 string GetURL(UInt_t dbNo) const {
00083 return ( dbNo < GetNumDb() ) ? fConnections[dbNo]-> GetUrl(): ""; }
00084 Bool_t IsTemporaryTable(const string& tableName,
00085 Int_t dbNo) const;
00086
00087
00088 Int_t AllocateSeqNo(const string& tableName,
00089 Int_t requireGlobal = 0,
00090 Int_t dbNo = 0) const;
00091 Int_t GetAuthorisingDbNo() const { return fGlobalSeqNoDbNo; }
00092 UInt_t GetNumDb() const {return fConnections.size();}
00093 Int_t GetTableDbNo(const string& tableName, Int_t selectDbNo = -1) const;
00094 Bool_t TableExists(const string& tableName, Int_t selectDbNo = -1) const {
00095 return this->GetTableDbNo(tableName,selectDbNo) >= 0; }
00096
00097
00098
00099 Int_t CreateTemporaryTable(const string& tableName,
00100 const string& tableDescr);
00101 void HoldConnections();
00102 void ReleaseConnections();
00103 void SetPermanent(UInt_t dbNo, Bool_t permanent = true);
00104
00105 protected:
00106
00107 private:
00108
00109 Int_t ReserveNextSeqNo(const string& tableName,
00110 Bool_t isGlobal,
00111 UInt_t dbNo) const;
00112 void SetAuthorisingEntry(Int_t entry) {fGlobalSeqNoDbNo = entry;}
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 ClassDef(DbiCascader,0)
00153
00154 };
00155
00156
00157 #endif // DBISKEL_H