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

PerStreamManager.cxx

Go to the documentation of this file.
00001 
00002 //
00003 // PerStreamManager
00004 //
00005 // Package: Per (Persistency).
00006 //
00007 // S. Kasahara 04/2001
00008 //
00009 // Purpose: Stream manager base class used by persistency package to manage
00010 //          input and output streams.
00011 //
00013 
00014 #include <string>
00015 
00016 #include "Persistency/PerStreamManager.h"
00017 #include "Persistency/PerStream.h"
00018 #include "MessageService/MsgService.h"
00019 
00020 std::ostream& operator<<(std::ostream& ms, const PerStreamManager& psm) { 
00021   return psm.Print(ms); 
00022 }
00023 
00024 ClassImp(PerStreamManager)
00025 
00026 //   Definition of static data members
00027 //   *********************************
00028 
00029 CVSID("$Id: PerStreamManager.cxx,v 1.18 2007/03/20 22:52:09 schubert Exp $");
00030 
00031 // Definition of methods (alphabetical order)
00032 // ******************************************
00033 
00034 void PerStreamManager::CloseFile(string streamname) {
00035   //  Purpose:  Close current file serving specified stream(s).
00036   //
00037   //  Argument: streamname  string  name of stream on which to close file.
00038   //                                if streamname="*" (default), all
00039   //                                streams will have their files closed.
00040   //
00041   //  Return:  none.
00042   //
00043   //  Contact:   S. Kasahara
00044   //
00045   //  Notes:  Invokes PerStream::CloseFile for each requested stream.
00046   //
00047 
00048 
00049   if (streamname == "*") {
00050     // Close file on all streams
00051     for (StreamMapConstItr citr = fStreamMap.begin(); 
00052          citr != fStreamMap.end(); ++citr) 
00053       citr -> second -> CloseFile(); 
00054   }
00055   else {
00056     // Close stream of specified streamname
00057     PerStream* stream = GetOpenedStream(streamname);
00058     if (stream) stream -> CloseFile();
00059   }
00060 
00061 }
00062 
00063 void PerStreamManager::CloseStream(string streamname) {
00064   //  Purpose:  Close specified stream(s) and erase from stream manager's map.
00065   //
00066   //  Argument: streamname  string  name of stream to be closed.
00067   //                                if streamname ="*" (default), all
00068   //                                streams will be closed.
00069   //
00070   //  Return:  none.
00071   //
00072   //  Contact:   S. Kasahara
00073   //
00074 
00075   if ( streamname == "*" ) {
00076     // Close all streams managed by streammanager.
00077     for (StreamMapItr itr=fStreamMap.begin();itr != fStreamMap.end(); ++itr) 
00078       delete (itr -> second); // retrieve stream memory
00079     fStreamMap.clear(); // clear all map entries
00080   }
00081   else {
00082     // Close stream of specified streamname
00083     StreamMapItr itr = fStreamMap.find(streamname);
00084     if (itr != fStreamMap.end()) {
00085       delete (itr -> second); // retrieve stream memory
00086       fStreamMap.erase(itr);
00087     }
00088   }
00089 
00090 }
00091 
00092 std::string PerStreamManager::GetCurrentFile(std::string streamname) const {
00093   //  Purpose:  Return current file name for specified stream.
00094   //
00095   //  Argument: streamname  If specified as "*", returns current file of
00096   //                        first open stream.
00097   //
00098   //  Return: current file name
00099   //
00100   //  Contact:   S. Kasahara
00101   //
00102 
00103   if ( streamname == "*" ) {
00104     for (StreamMapConstItr itr=fStreamMap.begin();itr!=fStreamMap.end();++itr){
00105       PerStream* stream = itr->second; 
00106       if ( stream -> IsOpen() ) return stream->GetFullFilePathName();
00107     }
00108   }
00109   else {
00110     PerStream* stream = this -> GetOpenedStream(streamname);
00111     if ( stream ) return stream->GetFullFilePathName();
00112   }
00113 
00114   return "";
00115 
00116 }
00117 
00118 PerStream* PerStreamManager::GetOpenedStream(std::string streamname) const {
00119   //
00120   //  Purpose:  Retrieve stream corresponding to streamname.
00121   //            Stream must have been previously opened with OpenStream method.
00122   //
00123   //  Argument: streamname  string  containing name of stream of interest.
00124   //
00125   //  Return:  pointer to a PerStream. If member with name
00126   //           streamname does not exist, returns (PerStream*)0.  
00127   //
00128   //  Contact:   S. Kasahara
00129   //
00130   //  Notes: PerStream objects are owned by the PerStreamManager and
00131   //         should only be deleted through the PerStreamManager::Close method.
00132   //
00133 
00134   StreamMapConstItr citr = fStreamMap.find(streamname);
00135   return (citr != fStreamMap.end()) ? citr -> second : (PerStream*)0;
00136 
00137 }
00138 
00139 UInt_t PerStreamManager::GetNumStreamOpen() const {
00140   //
00141   //  Purpose:  Return count of number of streams that are IsOpen() (both
00142   //            tree and file pointers are non-null)
00143   //
00144   //  Argument: none.
00145   //
00146   //  Return:  number of open streams.
00147   //
00148   //  Contact:   S. Kasahara
00149   //
00150 
00151   UInt_t nopen = 0;
00152 
00153   for(StreamMapConstItr citr=fStreamMap.begin();citr!=fStreamMap.end();++citr){
00154     if ( citr->second->IsOpen() ) nopen++;
00155   }
00156 
00157   return nopen; 
00158 
00159 }
00160 
00161 PerStreamManager::PerStreamManager() : fPrintOpt("") {
00162   // Purpose: Default constructor.
00163   //
00164   // Arguments: none.
00165   //
00166   // Return: none.
00167   //
00168   // Contact:  S. Kasahara
00169   //
00170 
00171 }
00172 
00173 PerStreamManager::~PerStreamManager() {
00174   //  Purpose:  Destructor.
00175   //
00176   //  Arguments: none.
00177   //
00178   //  Return:  none.
00179   //
00180   //  Contact:   S. Kasahara
00181   //
00182   
00183   // Close all managed streams and retrieve allocated memory
00184   CloseStream();
00185 
00186 }
00187 
00188 ostream& PerStreamManager::Print(ostream& ms,
00189                                  Option_t* /* option */) const {
00190   //  Purpose:  Print current map of streams maintained by stream manager on
00191   //            std::ostream.
00192   //
00193   //  Arguments: ms       std::ostream to display on.
00194   //             option   print option
00195   //
00196   //  Return:  std::ostream reference.
00197   //
00198   //  Contact:   S. Kasahara
00199   //
00200 
00201   ms << "StreamManager is currently managing " << GetNumStream() 
00202      << " stream(s):" << endl;
00203 
00204   Int_t nstream=0;
00205   for( StreamMapConstItr citr = fStreamMap.begin();
00206        citr != fStreamMap.end(); ++citr ) {
00207     ms << ++nstream << ")" << "Streamname " << citr -> first << endl;
00208     ms << *(citr -> second);
00209   }
00210 
00211   return ms;
00212 
00213 }
00214 
00215 void PerStreamManager::SetEnable(string streamname, bool enable) {
00216   //
00217   //  Purpose:  Enable/disable specified stream(s).
00218   //
00219   //  Argument: streamname  string  name of stream on which to close file.
00220   //                                if streamname="*" (default), all
00221   //                                streams will have their files closed.
00222   //            enable      bool    if true (default) stream is enabled.
00223   //                                disabled streams are skipped over
00224   //                                during stream manager i/o calls.
00225   //
00226   //  Return:  none.
00227   //
00228   //  Contact:   S. Kasahara
00229   //
00230   //  Notes:  Invokes PerStream::SetEnable for each requested stream.
00231   //
00232 
00233   if (streamname == "*") {
00234     // Close file on all streams
00235     for (StreamMapConstItr citr = fStreamMap.begin(); 
00236          citr != fStreamMap.end(); ++citr) 
00237       citr -> second -> SetEnable(enable); 
00238   }
00239   else {
00240     // Close stream of specified streamname
00241     PerStream* stream = GetOpenedStream(streamname);
00242     if (stream) stream -> SetEnable(enable);
00243   }
00244   
00245 }
00246 
00247 
00248 bool PerStreamManager::SetFile(string streamname,string fullfilepathname, 
00249                                Per::EAccessMode accessmode) {
00250   //  Purpose:  Sets new file for specified stream.
00251   //
00252   //  Arguments:streamname       string  name of stream to set file.
00253   //                             if streamname="*", all streams will have
00254   //                             their file set.
00255   //            fullfilepathname string  new filename.
00256   //            accessmode       Per::EAccessMode accessmode in which to open
00257   //                                              file.
00258   //
00259   //  Return:  bool  set true if PerStream::SetFile returned true
00260   //                 for at least one of the requested streams. 
00261   //
00262   //  Contact:   S. Kasahara
00263   //
00264   //  Notes: Invokes PerStream::SetFile (or PerOutputStream/
00265   //         PerInputStream::SetFile as appropriate) for each requested stream.
00266   //         Note that PerOutputStream::SetFile enforces the uniqueness
00267   //         of treenames in any given file to avoid overwriting trees.
00268 
00269   bool openok = false;
00270 
00271   if (streamname == "*") {
00272     // Set new file for all streams.  
00273     for (StreamMapConstItr citr=fStreamMap.begin();
00274                           citr!=fStreamMap.end();++citr) { 
00275       if (  citr -> second -> IsEnabled() && 
00276           !(citr -> second -> SetFile(fullfilepathname,accessmode)) ) {
00277         MSG("Per",Msg::kWarning) << "Failed to set new file for stream "
00278                                  << citr->first << endl;
00279       }
00280       else {
00281         openok=true;
00282       } 
00283     }
00284   }
00285   else {
00286     // SetFile for stream of specified streamname
00287     PerStream* stream = GetOpenedStream(streamname);
00288     if (stream) {
00289       if (!stream -> SetFile(fullfilepathname,accessmode)) {
00290         MSG("Per",Msg::kWarning) << "Failed to set new file for stream "
00291                                  << streamname << endl;
00292       }
00293       else {
00294         openok=true;
00295       }
00296     }
00297   }
00298 
00299   return openok;
00300 
00301 }
00302 
00303 void PerStreamManager::SetTestMode(string streamname, bool testmode) {
00304   //
00305   //  Purpose:  Set streams to i/o test mode.
00306   //
00307   //  Argument: streamname  string  name of stream.
00308   //                                if streamname="*" (default), action
00309   //                                is applied to all streams.
00310   //            testmode    bool    if true, testmode is enabled.
00311   //                                one application is that the job
00312   //                                won't abort on the read of corrupt 
00313   //                                record.
00314   //
00315   //  Return:  none.
00316   //
00317   //  Contact:   S. Kasahara
00318   //
00319 
00320   if (streamname == "*") {
00321     // Apply to all streams
00322     for (StreamMapConstItr citr = fStreamMap.begin(); 
00323          citr != fStreamMap.end(); ++citr) 
00324       citr -> second -> SetTestMode(testmode); 
00325   }
00326   else {
00327     // Apply to specified stream
00328     PerStream* stream = GetOpenedStream(streamname);
00329     if (stream) stream -> SetTestMode(testmode);
00330   }
00331   
00332 }
00333 
00334 
00335 
00336 
00337 
00338 
00339 
00340 
00341 
00342 
00343 
00344 
00345 
00346 
00347 
00348 
00349 
00350 
00351 
00352 
00353 

Generated on Mon Feb 15 11:07:19 2010 for loon by  doxygen 1.3.9.1