00001
00002
00003 #include <iostream>
00004 #include <sstream>
00005
00006 #include "TString.h"
00007 #include "TSystem.h"
00008 #include "TUrl.h"
00009
00010 #include "DatabaseInterface/Dbi.h"
00011 #include "DatabaseInterface/DbiCascader.h"
00012 #include "DatabaseInterface/DbiLogEntry.h"
00013 #include "DatabaseInterface/DbiOutRowStream.h"
00014 #include "DatabaseInterface/DbiResultPtr.h"
00015 #include "DatabaseInterface/DbiResultSet.h"
00016 #include "DatabaseInterface/DbiTableProxy.h"
00017 #include "DatabaseInterface/DbiTableProxyRegistry.h"
00018 #include "DatabaseInterface/DbiValidityRec.h"
00019 #include "MessageService/MsgService.h"
00020
00021
00022 ClassImp(DbiLogEntry)
00023
00024
00025
00026
00027
00028 CVSID("$Id: DbiLogEntry.cxx,v 1.12 2007/04/26 14:19:57 west Exp $\n \
00029 CVSID_DBIRESULTPTR ");
00030
00031
00032
00033
00034 #include "DatabaseInterface/DbiResultPtr.tpl"
00035 template class DbiResultPtr<DbiLogEntry>;
00036
00037 #include "DatabaseInterface/DbiWriter.tpl"
00038 template class DbiWriter<DbiLogEntry>;
00039
00040
00041
00042
00043
00044
00045
00046
00047 DbiLogEntry::DbiLogEntry(const string& tableName,
00048 const string& reason,
00049 Int_t detMask,
00050 Int_t simMask,
00051 Dbi::Task task,
00052 Int_t logSeqNoMin,
00053 Int_t logSeqNoMax,
00054 Int_t logNumSeqNo):
00055 fDbNo(0),
00056 fSeqNo(0),
00057 fLogTableName(tableName),
00058 fLogDetMask(detMask),
00059 fLogSimMask(simMask),
00060 fLogTask(task),
00061 fLogSeqNoMin(logSeqNoMin),
00062 fLogSeqNoMax(logSeqNoMax),
00063 fLogNumSeqNo(logNumSeqNo),
00064 fUserName("unknown user"),
00065 fProcessName(gProgName),
00066 fHostName(gSystem->HostName())
00067 {
00068
00069
00070
00071
00072 LEA_CTOR;
00073
00074 if ( fLogSeqNoMax == 0 ) fLogSeqNoMax = logSeqNoMin;
00075 if ( fLogNumSeqNo == 0 && logSeqNoMin != 0
00076 ) fLogNumSeqNo = fLogSeqNoMax - fLogSeqNoMin +1;
00077
00078 this->SetServerName();
00079 this->SetReason(reason);
00080
00081
00082 const char* userName = gSystem->Getenv("USER");
00083 if ( ! userName ) userName = gSystem->Getenv("USERNAME");
00084 if ( ! userName ) userName = gSystem->Getenv("LOGNAME");
00085 if ( userName ) fUserName = userName;
00086
00087 }
00088
00089
00090 DbiLogEntry::~DbiLogEntry() {
00091
00092
00093
00094
00095 LEA_DTOR;
00096
00097 }
00098
00099
00100 std::ostream& operator<<(ostream& s, const DbiLogEntry& logEntry) {
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 s << "DbiLogEntry: Table " << logEntry.GetLogTableName();
00124 if ( logEntry.GetLogSeqNoMin() == logEntry.GetLogSeqNoMax() )
00125 s << " SEQNO: " << logEntry.GetLogSeqNoMin();
00126 else
00127 s << " SEQNO min: " << logEntry.GetLogSeqNoMin()
00128 << " SEQNO max: " << logEntry.GetLogSeqNoMax()
00129 << " No. SEQNOs: " << logEntry.GetLogNumSeqNo();
00130 s << " DetectorMask: " << logEntry.GetDetectorMask()
00131 << " SimMask: " << logEntry.GetSimMask()
00132 << " Task: " << logEntry.GetTask()
00133 << "\n Updated on " << logEntry.GetUpdateTime().AsString("s")
00134 << " by " << logEntry.GetUserName()
00135 << " running " << logEntry.GetProcessName()
00136 << " on " << logEntry.GetHostName()
00137 << " connected to " << logEntry.GetServerName()
00138 << "\n Reason for update:-\n " << logEntry.GetReason() << endl;
00139
00140 return s;
00141
00142 }
00143
00144
00145
00146 void DbiLogEntry::Fill(DbiResultSet& rs,
00147 const DbiValidityRec* vrec) {
00148
00149
00150
00151
00152 rs >> fLogTableName
00153 >> fLogSeqNoMin
00154 >> fLogSeqNoMax
00155 >> fLogNumSeqNo
00156 >> fUserName
00157 >> fProcessName
00158 >> fHostName
00159 >> fServerName
00160 >> fReason;
00161 fLogDetMask = fLogSimMask = fLogTask = 0;
00162 if ( vrec ) {
00163 fLogDetMask = vrec->GetVldRange().GetDetectorMask();
00164 fLogSimMask = vrec->GetVldRange().GetSimMask();
00165 fLogTask = vrec->GetTask();
00166 fUpdateTime = vrec->GetVldRange().GetTimeStart();
00167 }
00168 }
00169
00170
00171
00172 void DbiLogEntry::Recreate(const string& tableName,
00173 const string& reason,
00174 Int_t detMask,
00175 Int_t simMask,
00176 Dbi::Task task,
00177 Int_t logSeqNoMin,
00178 Int_t logSeqNoMax,
00179 Int_t logNumSeqNo)
00180 {
00181
00182
00183
00184
00185 if ( fSeqNo > 0
00186 && ( tableName == "" || tableName == fLogTableName )
00187 && ( detMask == Detector::FullMask() || detMask == fLogDetMask )
00188 && ( simMask == SimFlag::FullMask() || simMask == fLogSimMask )
00189 && ( task == 0 || task == fLogTask )
00190 && ( logSeqNoMin == 0 || logSeqNoMin == fLogSeqNoMin)
00191 && ( logSeqNoMax == 0 || logSeqNoMax == fLogSeqNoMax )
00192 && ( logNumSeqNo == 0 || logNumSeqNo == fLogNumSeqNo )
00193 ) {
00194 if ( reason != "" ) this->SetReason(reason);
00195 return;
00196 }
00197
00198
00199 fDbNo = 0;
00200 fSeqNo =0;
00201 fLogTableName = tableName;
00202 fLogDetMask = detMask;
00203 fLogSimMask = simMask;
00204 fLogTask = task;
00205 fLogSeqNoMin = logSeqNoMin;
00206 fLogSeqNoMax = logSeqNoMax;
00207 fLogNumSeqNo = logNumSeqNo;
00208 this->SetReason(reason);
00209
00210 }
00211
00212
00213
00214 void DbiLogEntry::SetReason(const string& reason) {
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 fReason = reason;
00229
00230
00231
00232 if ( fReason.size() && fReason[0] == '@' ) {
00233 string fileName(fReason,1);
00234 fReason.clear();
00235 ifstream reasonFile(fileName.c_str());
00236 if ( ! reasonFile.is_open() ) {
00237 MSG("Dbm",Msg::kError) << "Cannot read \"Reason File\" " << fileName << endl;
00238 }
00239 else {
00240 string line;
00241 while ( ! reasonFile.eof() ) {
00242 getline(reasonFile,line);
00243 if ( line.substr(0,11) == "FIXUP-FILE:"
00244 || line.substr(0,10) == "BROADCAST:" ) {
00245 continue;
00246 }
00247 if ( fReason.size() ) fReason += '\n';
00248 fReason += line;
00249 }
00250 reasonFile.close();
00251 }
00252 }
00253 }
00254
00255
00256
00257 void DbiLogEntry::SetServerName() {
00258
00259
00260
00261
00262 string urlStr = DbiTableProxyRegistry::Instance().GetCascader().GetURL(fDbNo);
00263 TUrl url(urlStr.c_str());
00264 fServerName = url.GetHost();
00265
00266 }
00267
00268
00269 void DbiLogEntry::Store(DbiOutRowStream& ors,
00270 const DbiValidityRec* ) const {
00271
00272
00273
00274
00275 ors << fLogTableName
00276 << fLogSeqNoMin
00277 << fLogSeqNoMax
00278 << fLogNumSeqNo
00279 << fUserName
00280 << fProcessName
00281 << fHostName
00282 << fServerName
00283 << fReason;
00284 }
00285
00286
00287
00288 Bool_t DbiLogEntry::Write(UInt_t dbNo,
00289 Int_t logSeqNo) {
00290
00291
00292
00293
00294
00295 if ( logSeqNo > 0 ) {
00296 if ( fLogNumSeqNo == 0 ) {
00297 fLogSeqNoMin = logSeqNo;
00298 fLogSeqNoMax = logSeqNo;
00299 }
00300 if ( logSeqNo < fLogSeqNoMin ) fLogSeqNoMin = logSeqNo;
00301 if ( logSeqNo > fLogSeqNoMax ) fLogSeqNoMax = logSeqNo;
00302 ++fLogNumSeqNo;
00303 }
00304
00305 if ( ! this->HasReason() || fLogNumSeqNo == 0) {
00306 MSG("Dbm",Msg::kError) << "Cannot write LogEntry - no reason and/or no SEQNOs defined "
00307 << endl;
00308 return kFALSE;
00309 }
00310
00311 if ( fSeqNo != 0 && dbNo != fDbNo ) {
00312 MSG("Dbm",Msg::kError) << "Cannot write LogEntry - attempting to switch from database"
00313 << fDbNo << " to " << dbNo << endl;
00314 return kFALSE;
00315 }
00316
00317 fDbNo = dbNo;
00318 DbiTableProxy& tblProxy = DbiTableProxyRegistry::Instance()
00319 .GetTableProxy("DBILOGENTRY",this);
00320 bool replace = true;
00321
00322
00323 if ( fSeqNo == 0 ) {
00324 replace = false;
00325 int seqNo = tblProxy.GetCascader().AllocateSeqNo("DBILOGENTRY",0,fDbNo);
00326 if ( seqNo <= 0 ) {
00327 MAXMSG("Dbi",Msg::kError,20)
00328 << "Cannot get sequence number for table DBILOGENTRY" << endl;
00329 return kFALSE;
00330 }
00331 fSeqNo = seqNo;
00332 }
00333
00334
00335 VldRange vr(fLogDetMask,fLogSimMask,fUpdateTime,fUpdateTime,"DbiLogEntry");
00336 DbiValidityRec vrec(vr,fLogTask,-1,0);
00337
00338
00339 DbiSqlValPacket packet;
00340 packet.Recreate("DBILOGENTRY",
00341 vrec.GetVldRange(),
00342 -1,
00343 vrec.GetTask(),
00344 vrec.GetCreationDate());
00345 packet.AddDataRow(tblProxy,0,*this);
00346 packet.SetSeqNo(fSeqNo);
00347 return packet.Store(fDbNo,replace);
00348 ;
00349 }
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380