1 #include "AliStorageServerThread.h"
2 #include "AliStorageTypes.h"
3 #include "AliESDEvent.h"
13 AliStorageServerThread::AliStorageServerThread() :
18 fDatabase = new AliStorageDatabase();
19 //load parameters from config file
20 ifstream configFile (GetConfigFilePath());
23 if (configFile.is_open())
27 while(configFile.good())
29 getline(configFile,line);
30 from = line.find("\"")+1;
31 to = line.find_last_of("\"");
32 if(line.find("STORAGE_PATH=")==0)
34 fStoragePath=line.substr(from,to-from);
45 cout<<"SERVER -- Unable to open config file"<<endl;
49 //start communication on socket
53 AliStorageServerThread::~AliStorageServerThread()
55 cout<<"SERVER -- AliStorageServerThread destructor called";
56 if (fDatabase) {delete fDatabase;}
57 cout<<" --- OK"<<endl;
60 void AliStorageServerThread::StartCommunication()
62 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
63 storageSockets socket = SERVER_COMMUNICATION_REP;
64 eventManager->CreateSocket(socket);
66 struct serverRequestStruct *request;
70 request = eventManager->GetServerStruct(socket);
72 switch(request->messageType)
74 case REQUEST_LIST_EVENTS:
76 vector<serverListStruct> result = fDatabase->GetList(request->list);
77 eventManager->Send(result,socket);
80 case REQUEST_GET_EVENT:
82 AliESDEvent *event = fDatabase->GetEvent(request->event);
83 eventManager->Send(event,socket);
87 case REQUEST_GET_NEXT_EVENT:
89 cout<<"NEXT EVENT request received"<<endl;
90 AliESDEvent *event = fDatabase->GetNextEvent(request->event);
91 eventManager->Send(event,socket);
95 case REQUEST_GET_PREV_EVENT:
97 AliESDEvent *event = fDatabase->GetPrevEvent(request->event);
98 eventManager->Send(event,socket);
102 case REQUEST_GET_LAST_EVENT:
104 AliESDEvent *event = fDatabase->GetLastEvent();
105 eventManager->Send(event,socket);
109 case REQUEST_GET_FIRST_EVENT:
111 AliESDEvent *event = fDatabase->GetFirstEvent();
112 eventManager->Send(event,socket);
116 case REQUEST_MARK_EVENT:
118 struct eventStruct *markData = &(request->event);
119 eventManager->Send(MarkEvent(*markData),socket);
128 bool AliStorageServerThread::MarkEvent(struct eventStruct event)
130 string pathToFile = fDatabase->GetFilePath(event);
131 TFile *tmpFile = new TFile(pathToFile.c_str(),"read");
134 cout<<"SERVER -- couldn't open temp file"<<endl;
138 tmpFile->cd(Form("run%d",event.runNumber));
140 AliESDEvent *eventToMark = (AliESDEvent*)gDirectory->Get(Form("event%d",event.eventNumber));
143 cout<<"SERVER -- couldn't find such event"<<endl;
144 if(tmpFile){delete tmpFile;}
147 cout<<"SERVER -- Marking event:"<<eventToMark->GetEventNumberInFile()<<endl;
149 TFile *permFile = new TFile(Form("%s/permEvents.root",fStoragePath.c_str()),"update");//open/create perm file
153 cout<<"SERVER -- Couldn't open perm file"<<endl;
154 if(tmpFile){delete tmpFile;}
155 if(eventToMark){delete eventToMark;}
159 //create new directory for this run
160 TDirectory *currentRun;
161 if((currentRun = permFile->mkdir(Form("run%d",event.runNumber))))
163 cout<<"SERVER -- creating new directory for this run"<<endl;
168 cout<<"SERVER -- opening existing directory for this run"<<endl;
169 permFile->cd(Form("run%d",event.runNumber));
172 //try to add record to the database
173 if(!fDatabase->MarkEvent(event))
175 cout<<"SERVER -- could not mark event in the database"<<endl;
176 if(tmpFile){delete tmpFile;}
177 if(eventToMark){delete eventToMark;}
178 if(permFile){delete permFile;}
182 eventToMark->Write(Form("event%d",event.eventNumber));
186 if(tmpFile){delete tmpFile;}
187 if(eventToMark){delete eventToMark;}
188 if(permFile){delete permFile;}
189 // if(currentRun)delete currentRun;//this line crashes if there is no permanent file yet