1 #include "AliStorageServerThread.h"
2 #include "AliStorageTypes.h"
3 #include "AliESDEvent.h"
13 AliStorageServerThread::AliStorageServerThread() :
17 fDatabase = new AliStorageDatabase();
20 //load parameters from config file
21 ifstream configFile (GetConfigFilePath());
22 if (configFile.is_open())
26 while(configFile.good())
28 getline(configFile,line);
29 from = line.find("\"")+1;
30 to = line.find_last_of("\"");
31 if(line.find("STORAGE_PATH=")==0){
32 fStoragePath=line.substr(from,to-from);
35 if(configFile.eof()){configFile.clear();}
38 else{cout<<"SERVER -- Unable to open config file"<<endl;}
41 //start communication on socket
42 cout<<"Starting server's communication"<<endl;
46 AliStorageServerThread::~AliStorageServerThread()
48 cout<<"SERVER -- AliStorageServerThread destructor called";
49 if (fDatabase) {delete fDatabase;}
50 cout<<" --- OK"<<endl;
53 void AliStorageServerThread::StartCommunication()
55 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
56 storageSockets socket = SERVER_COMMUNICATION_REP;
57 eventManager->CreateSocket(socket);
59 struct serverRequestStruct *request;
63 cout<<"Server waiting for requests"<<endl;
64 request = eventManager->GetServerStruct(socket);
65 cout<<"Server received request"<<endl;
66 switch(request->messageType)
68 case REQUEST_LIST_EVENTS:
70 cout<<"SERVER -- received request for list of events"<<endl;
71 vector<serverListStruct> result = fDatabase->GetList(request->list);
72 cout<<"SERVER -- got list from database"<<endl;
73 eventManager->Send(result,socket);
74 cout<<"SERVER -- list was sent"<<endl;
77 case REQUEST_GET_EVENT:
79 cout<<"get event"<<endl;
81 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 cout<<"PREV request"<<endl;
98 AliESDEvent *event = fDatabase->GetPrevEvent(request->event);
99 eventManager->Send(event,socket);
103 case REQUEST_GET_LAST_EVENT:
105 cout<<"LAST request"<<endl;
106 AliESDEvent *event = fDatabase->GetLastEvent();
107 eventManager->Send(event,socket);
111 case REQUEST_GET_FIRST_EVENT:
113 cout<<"FIRST request"<<endl;
114 AliESDEvent *event = fDatabase->GetFirstEvent();
115 eventManager->Send(event,socket);
119 case REQUEST_MARK_EVENT:
121 cout<<"MARK request"<<endl;
122 struct eventStruct *markData = &(request->event);
123 eventManager->Send(MarkEvent(*markData),socket);
128 cout<<"unknown request message"<<endl;
129 eventManager->Send(false,socket);
137 bool AliStorageServerThread::MarkEvent(struct eventStruct event)
139 string pathToFile = fDatabase->GetFilePath(event);
140 TFile *tmpFile = new TFile(pathToFile.c_str(),"read");
143 cout<<"SERVER -- couldn't open temp file"<<endl;
147 tmpFile->cd(Form("run%d",event.runNumber));
149 AliESDEvent *eventToMark = (AliESDEvent*)gDirectory->Get(Form("event%d",event.eventNumber));
152 cout<<"SERVER -- couldn't find such event"<<endl;
153 if(tmpFile){tmpFile->Close();delete tmpFile;}
156 cout<<"SERVER -- Marking event:"<<eventToMark->GetEventNumberInFile()<<endl;
158 TFile *permFile = new TFile(Form("%s/permEvents.root",fStoragePath.c_str()),"update");//open/create perm file
162 cout<<"SERVER -- Couldn't open perm file"<<endl;
163 if(tmpFile){tmpFile->Close();delete tmpFile;}
164 if(eventToMark){delete eventToMark;}
168 //create new directory for this run
169 TDirectory *currentRun;
170 if((currentRun = permFile->mkdir(Form("run%d",event.runNumber))))
172 cout<<"SERVER -- creating new directory for this run"<<endl;
177 cout<<"SERVER -- opening existing directory for this run"<<endl;
178 permFile->cd(Form("run%d",event.runNumber));
181 //try to add record to the database
182 if(!fDatabase->MarkEvent(event))
184 cout<<"SERVER -- could not mark event in the database"<<endl;
185 if(tmpFile){delete tmpFile;}
186 if(eventToMark){delete eventToMark;}
187 if(permFile){delete permFile;}
191 eventToMark->Write(Form("event%d",event.eventNumber));
195 if(tmpFile){delete tmpFile;}
196 if(eventToMark){delete eventToMark;}
197 if(permFile){delete permFile;}
198 // if(currentRun)delete currentRun;//this line crashes if there is no permanent file yet