#include "AliStorageServerThread.h" #include "AliStorageTypes.h" #include "AliESDEvent.h" #include #include #include #include using namespace std; AliStorageServerThread::AliStorageServerThread() : fDatabase(0), fStoragePath("") { fDatabase = new AliStorageDatabase(); TThread::Lock(); //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) { cout<<"Server waiting for requests"<GetServerStruct(socket); cout<<"Server received request"<messageType) { case REQUEST_LIST_EVENTS: { cout<<"SERVER -- received request for list of events"< result = fDatabase->GetList(request->list); cout<<"SERVER -- got list from database"<Send(result,socket); cout<<"SERVER -- list was sent"<GetEvent(request->event); TThread::UnLock(); 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: { cout<<"PREV request"<GetPrevEvent(request->event); eventManager->Send(event,socket); delete event; break; } case REQUEST_GET_LAST_EVENT: { cout<<"LAST request"<GetLastEvent(); eventManager->Send(event,socket); delete event; break; } case REQUEST_GET_FIRST_EVENT: { cout<<"FIRST request"<GetFirstEvent(); eventManager->Send(event,socket); delete event; break; } case REQUEST_MARK_EVENT: { cout<<"MARK request"<event); eventManager->Send(MarkEvent(*markData),socket); break; } default: { cout<<"unknown request message"<Send(false,socket); 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"<Close();delete tmpFile;} return false; } cout<<"SERVER -- Marking event:"<GetEventNumberInFile()<Close();delete tmpFile;} if(eventToMark){delete eventToMark;} return false; } //create new directory for this run TDirectory *currentRun; if((currentRun = permFile->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; }