00001 #ifndef ARCHIVER_H 00002 #define ARCHIVER_H 00003 00004 #include <is/info.h> 00005 #include <is/inforeceiver.h> 00006 #include <ipc/object.h> 00007 #include <ipc/server.h> 00008 00009 #include <string> 00010 #include <memory> 00011 #include <sys/types.h> 00012 #include <unistd.h> 00013 00014 #include <boost/thread.hpp> 00015 #include "ArchivingServiceInterface.hh" 00016 #include "ArchiverArguments.h" 00017 #include "Sct/Exception.h" 00018 #include "Sct/ConfigurationException.h" 00019 #include "Sct/LogicErrors.h" 00020 #include "Sct/IoExceptions.h" 00021 #include "Sct/Archive/IOManagerArchive.h" 00022 00023 using namespace Sct; 00024 namespace SctArchiving { 00025 class ArchivingCommand; 00026 class ArchivingWorkerGroup; 00035 class Archiver: public IPCNamedObject<POA_ArchivingServiceI::ArchivingServiceInterface, ipc::multi_thread>, private boost::noncopyable{ 00036 private: 00038 Archiver(ArchiverArguments args); 00039 protected: 00041 ~Archiver() throw(); 00042 private: 00043 static Archiver* archiver; 00044 00045 public: 00046 void shutdown() {}; 00051 static Archiver& instance(); 00052 00057 static Archiver& initialize(ArchiverArguments args); 00061 void go(unsigned nWorker) throw(IsException); 00065 const char* getStatus() const throw(); 00070 virtual char* status(); 00074 virtual CORBA::Short busy(); 00078 virtual CORBA::Short queueLength(); 00082 void setFifo(bool); 00086 bool isFifo(); 00090 virtual void suspendCallbacks (CORBA::Boolean doSuspend); 00094 static void archive_callback(ISCallbackInfo * isc); 00095 00097 IPCServer& getArchiverServer() throw(); 00098 00102 virtual void archiveISName (const char* ioNameIS); 00106 virtual void retrieveISName (const char* ioNameIS); 00110 virtual void retrieveArchName (const char* archivingName); 00114 virtual void retrieve(const char* runNumber, const char* scanNumber, const char* className, const char* specifier); 00118 virtual CORBA::Short getCompressionLevel (); 00122 virtual void setCompressionLevel (CORBA::Short level); 00126 virtual void setRetrieveIsServer (const char* serverName); 00127 /* 00128 Add an ArchivingCommand to the workergroup. 00129 */ 00130 virtual void addCommand(boost::shared_ptr<ArchivingCommand> command) const; 00134 void incrimentNArchived() throw(); 00138 void incrimentNRetrieved() throw(); 00142 void incrimentNValidated() throw(); 00146 void addISTime(double time) throw(); 00150 void addFileTime(double time) throw(); 00154 Sct::Archive::IOManagerArchive& Archiver::getIOManagerArchive() const; 00158 string internal_getRetrieveIsServer() const throw(); 00159 00161 virtual void setPersistentDirectory(const char* newDirectory); 00162 00166 char * getRetrieveIsServer() throw(); 00167 /* 00168 save any unsaved data - may be time consuming! 00169 */ 00170 void recover(); 00171 private: 00175 ArchivingWorkerGroup* workergroup; 00179 void subscribe(const string& servername, const string& regexp, ISCallbackInfo::Callback callback); 00183 std::auto_ptr<ISInfoReceiver> infoReceiver; 00184 /* counters */ 00185 long nArchived; 00186 long nRetrieved; 00187 long nValidated; 00188 double isTimeTaken; 00189 double fileTimeTaken; 00190 mutable boost::recursive_mutex counterMutex; 00191 double getAverageTime(double time) const throw(); 00193 Sct::Archive::IOManagerArchive* m_archive_manager; 00194 std::string m_retrieval_is_server; 00195 bool m_suspend_callback; 00196 ArchiverArguments m_args; 00197 }; // end of definition of class Archiver; 00198 00199 }// end of namespace SctArchiving 00200 #endif // #ifndef ARCHIVER_H