Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

DbiLogEntry.cxx

Go to the documentation of this file.
00001 // $Id: DbiLogEntry.cxx,v 1.12 2007/04/26 14:19:57 west Exp $
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 //   Definition of static data members
00026 //   *********************************
00027 
00028 CVSID("$Id: DbiLogEntry.cxx,v 1.12 2007/04/26 14:19:57 west Exp $\n  \
00029       CVSID_DBIRESULTPTR ");
00030 
00031 //  Instantiate associated Result Pointer and writer classes.
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 //    Definition of all member functions (static or otherwise)
00041 //    *******************************************************
00042 //
00043 //    -  ordered: ctors, dtor, operators then in alphabetical order.
00044 
00045 //.....................................................................
00046 
00047 DbiLogEntry::DbiLogEntry(const string& tableName, /* = "" */
00048                          const string& reason,    /* = "" */
00049                          Int_t detMask,           /* = full mask */
00050                          Int_t simMask,           /* = full mask */
00051                          Dbi::Task task,          /* = 0  */
00052                          Int_t logSeqNoMin,       /* = 0  */ 
00053                          Int_t logSeqNoMax,       /* = 0  */ 
00054                          Int_t logNumSeqNo):      /* = 0  */ 
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 //  Purpose:  Constructor
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   // Try to get username from the environment.
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 //  Purpose:  Destructor
00094 
00095   LEA_DTOR;
00096 
00097 }
00098 //.....................................................................
00099 
00100 std::ostream& operator<<(ostream& s, const DbiLogEntry& logEntry) {
00101 //
00102 //
00103 //  Purpose:  Output Log Entry to message stream.
00104 //
00105 //  Arguments: 
00106 //    s            in    Message stream
00107 //    logEntry        in    Configuration set to be output
00108 //
00109 //  Return:        Message stream   
00110 //
00111 //  Contact:   N. West
00112 //
00113 //  Specification:-
00114 //  =============
00115 //
00116 //  o Output configuration set to message stream.
00117 
00118 //  Program Notes:-
00119 //  =============
00120 
00121 //  None.
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 //  Purpose:  Fill oject from Result Set
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,           /* = full mask */
00175                            Int_t simMask,           /* = full mask */
00176                            Dbi::Task task,          /* = 0  */
00177                            Int_t logSeqNoMin,       /* = 0  */ 
00178                            Int_t logSeqNoMax,       /* = 0  */ 
00179                            Int_t logNumSeqNo)       /* = 0  */ 
00180 {
00181 //
00182 //
00183 //  Purpose:  Recreate, unless new state consistent with old.
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 //  Purpose: Set reason. 
00218 //           String can  be "@file-containing-reason" in which case 
00219 //           contents of file is used to define the reason excluding
00220 //           any line begining:-
00221 //           
00222 //               FIXUP-FILE:
00223 //           or  BROADCAST:
00224 //           
00225 //           This allows DMauto fix-up files to provide log entries as well
00226 //           as updates.
00227 
00228   fReason = reason;
00229 
00230   // If fReason starts '@' treat remainder as file name 
00231   // to be read into fReason.
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 //  Purpose: Set DB Server name from cascade number. 
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* /* vrec */) const {
00271 //
00272 //
00273 //  Purpose:  Stream object to output row stream
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)     /* =0 */ {
00290 //
00291 //
00292 //  Purpose: Write, or rewrite this entry, adding logSeqNo to range of
00293 //           update SEQNOs if non-zero.
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   // Allocate SEQNO before first write.
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   // Construct a DbiValidityRec.
00335   VldRange     vr(fLogDetMask,fLogSimMask,fUpdateTime,fUpdateTime,"DbiLogEntry");
00336   DbiValidityRec vrec(vr,fLogTask,-1,0);
00337 
00338   // Now build and output DbiSqlValPacket.
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 /*    Template for New Member Function
00351 
00352 //.....................................................................
00353 
00354 DbiLogEntry:: {
00355 //
00356 //
00357 //  Purpose:  
00358 //
00359 //  Arguments: 
00360 //    xxxxxxxxx    in    yyyyyy
00361 //
00362 //  Return:    
00363 //
00364 //  Contact:   N. West
00365 //
00366 //  Specification:-
00367 //  =============
00368 //
00369 //  o 
00370 
00371 //  Program Notes:-
00372 //  =============
00373 
00374 //  None.
00375 
00376 
00377 }
00378 
00379 */
00380 

Generated on Mon Feb 15 11:06:34 2010 for loon by  doxygen 1.3.9.1