#include "AliStorageServerThread.h" #include "AliStorageTypes.h" #include "AliESDEvent.h" #include #include #include #include using namespace std; AliStorageServerThread::AliStorageServerThread() : fDatabase(0), fStoragePath("") { TThread::Lock(); fDatabase = new AliStorageDatabase(); //load parameters from config file ifstream configFile (GetConfigFilePath()); if (configFile.is_open()) { string line; int from,to; while(configFile.good()) { getline(configFile,line); from = line.find("\"")+1; to = line.find_last_of("\""); if(line.find("STORAGE_PATH=")==0) { fStoragePath=line.substr(from,to-from); } } if(configFile.eof()) { configFile.clear(); } configFile.close(); } else { cout<<"SERVER -- Unable to open config file"<CreateSocket(socket); struct serverRequestStruct *request; while(1) { request = eventManager->GetServerStruct(socket); switch(request->messageType) { case REQUEST_LIST_EVENTS: { vector result = fDatabase->GetList(request->list); eventManager->Send(result,socket); break; } case REQUEST_GET_EVENT: { AliESDEvent *event = fDatabase->GetEvent(request->event); eventManager->Send(event,socket); delete event; break; } case REQUEST_GET_NEXT_EVENT: { cout<<"NEXT EVENT request received"<GetNextEvent(request->event); eventManager->Send(event,socket); delete event; break; } case REQUEST_GET_PREV_EVENT: { AliESDEvent *event = fDatabase->GetPrevEvent(request->event); eventManager->Send(event,socket); delete event; break; } case REQUEST_GET_LAST_EVENT: { AliESDEvent *event = fDatabase->GetLastEvent(); eventManager->Send(event,socket); delete event; break; } case REQUEST_GET_FIRST_EVENT: { AliESDEvent *event = fDatabase->GetFirstEvent(); eventManager->Send(event,socket); delete event; break; } case REQUEST_MARK_EVENT: { struct eventStruct *markData = &(request->event); eventManager->Send(MarkEvent(*markData),socket); break; } default:break; } } } bool AliStorageServerThread::MarkEvent(struct eventStruct event) { string pathToFile = fDatabase->GetFilePath(event); TFile *tmpFile = new TFile(pathToFile.c_str(),"read"); if(!tmpFile) { cout<<"SERVER -- couldn't open temp file"<cd(Form("run%d",event.runNumber)); AliESDEvent *eventToMark = (AliESDEvent*)gDirectory->Get(Form("event%d",event.eventNumber)); if(!eventToMark) { cout<<"SERVER -- couldn't find such event"<GetEventNumberInFile()<mkdir(Form("run%d",event.runNumber)))) { cout<<"SERVER -- creating new directory for this run"<cd(); } else { cout<<"SERVER -- opening existing directory for this run"<cd(Form("run%d",event.runNumber)); } //try to add record to the database if(!fDatabase->MarkEvent(event)) { cout<<"SERVER -- could not mark event in the database"<Write(Form("event%d",event.eventNumber)); permFile->Close(); tmpFile->Close(); if(tmpFile){delete tmpFile;} if(eventToMark){delete eventToMark;} if(permFile){delete permFile;} // if(currentRun)delete currentRun;//this line crashes if there is no permanent file yet return true; }