00001 #ifndef ARCHIVER_H
00002 #define ARCHIVER_H
00003
00004 #include <is/isinfo.h>
00005 #include <ipc/object.h>
00006 #include <ipc/server.h>
00007
00008 #include <string>
00009 #include <memory>
00010 #include <sys/types.h>
00011 #include <unistd.h>
00012
00013 #include <boost/thread.hpp>
00014 #include "ArchivingServiceI.hh"
00015 #include "Sct/Exception.h"
00016 #include "Sct/ConfigurationException.h"
00017 #include "Sct/LogicErrors.h"
00018 #include "Sct/IoExceptions.h"
00019 #include "Sct/Archive/IOManagerArchive.h"
00020
00021 using namespace Sct;
00022 namespace SctArchiving {
00023 class ArchivingCommand;
00024 class ArchivingWorkerGroup;
00030 class Archiver: public IPCObject, public virtual ArchivingServiceI_T_ArchivingServiceInterface, private boost::noncopyable{
00031 private:
00033 Archiver() throw(ConfigurationException);
00035 ~Archiver() throw();
00036 static Archiver* archiver;
00037
00038 public:
00043 static Archiver& instance();
00044
00049 static Archiver& initialize() throw(ConfigurationException);
00050
00054 void go(unsigned nWorker) throw(IsException);
00058 const char* getStatus() const throw();
00063 virtual char* status(ArchivingServiceIStatus* status);
00065 virtual ilu_ShortInteger busy(ArchivingServiceIStatus *_status);
00067 virtual ilu_ShortInteger queueLength(ArchivingServiceIStatus *_status);
00069 virtual void suspendCallbacks (ArchivingServiceIStatus *_status, ilu_Boolean doSuspend);
00073 static void archive_callback(ISCallbackInfo * isc);
00074
00076 IPCServer& getArchiverServer() throw();
00077
00079 virtual void archiveISName (ArchivingServiceIStatus *status, char* ioNameIS);
00081 virtual void retrieveISName (ArchivingServiceIStatus *status, char* ioNameIS);
00083 virtual void retrieveArchName (ArchivingServiceIStatus *status, char* archivingName);
00085 virtual void retrieve(ArchivingServiceIStatus *_status, char* runNumber, char* scanNumber, char* className, char* specifier);
00087 virtual ilu_ShortInteger getCompressionLevel (ArchivingServiceIStatus *_status);
00089 virtual void setCompressionLevel (ArchivingServiceIStatus *_status, ilu_ShortInteger level);
00091 virtual void setRetrieveIsServer (ArchivingServiceIStatus *_status, ilu_T_CString serverName);
00092
00093
00094
00095 virtual void addCommand(boost::shared_ptr<ArchivingCommand> command) const;
00099 void incrimentNArchived() throw();
00103 void incrimentNRetrieved() throw();
00107 void incrimentNValidated() throw();
00111 void addISTime(double time) throw();
00115 void addFileTime(double time) throw();
00119 Sct::Archive::IOManagerArchive& Archiver::getIOManagerArchive() const;
00121 string getRetrieveIsServer() const throw();
00122 private:
00124 ArchivingWorkerGroup* workergroup;
00126 void subscribe(const string& servername, const string& regexp, ISCallbackInfo::Callback callback);
00128 std::auto_ptr<ISInfoReceiver> infoReceiver;
00129
00130 long nArchived;
00131 long nRetrieved;
00132 long nValidated;
00133 double isTimeTaken;
00134 double fileTimeTaken;
00135 boost::mutex counterMutex;
00136 double getAverageTime(double time) const throw();
00138 Sct::Archive::IOManagerArchive* m_archive_manager;
00139
00140 std::string m_retrieval_is_server;
00141 bool m_suspend_callback;
00142 };
00143
00144 }
00145 #endif // #ifndef ARCHIVER_H