#include "AliStorageDatabase.h" #include #include #include #include #include #include #include using namespace std; AliStorageDatabase::AliStorageDatabase() : fHost(""), fPort(""), fDatabase(""), fUID(""), fPassword(""), fTable(""), fServer(0), fStoragePath("") { TThread::Lock(); 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("HOST=")==0){ fHost=line.substr(from,to-from); } else if(line.find("PORT=")==0){ fPort=line.substr(from,to-from); } else if(line.find("DATABASE=")==0){ fDatabase=line.substr(from,to-from); } else if(line.find("USER=")==0){ fUID=line.substr(from,to-from); } else if(line.find("PASS=")==0){ fPassword=line.substr(from,to-from); } else if(line.find("TABLE=")==0){ fTable=line.substr(from,to-from); } else if(line.find("STORAGE_PATH=")==0){ fStoragePath=line.substr(from,to-from); } } if(configFile.eof()){configFile.clear();} configFile.close(); } else{cout << "DATABASE -- Unable to open file" <Query(Form("select * FROM %s WHERE run_number = %d AND event_number = %d AND permanent = 1;",fTable.c_str(),runNumber,eventNumber)); TSQLRow *row = res->Next(); if(!row) { res = fServer->Query(Form("REPLACE INTO %s (run_number,event_number,system,multiplicity,permanent,file_path) VALUES (%d,%d,'%s',%d,0,'%s');",fTable.c_str(),runNumber,eventNumber,system,multiplicity,filePath)); } delete row; delete res; } bool AliStorageDatabase::MarkEvent(struct eventStruct event) { TSQLResult* res; res = fServer->Query(Form("UPDATE %s SET permanent = 1 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber)); if(!res) { cout<<"DATABASE -- couldn't update permanent flag"<Query(Form("UPDATE %s SET file_path = '%s' WHERE run_number = %d AND event_number = %d;",fTable.c_str(),Form("%s/permEvents.root",fStoragePath.c_str()), event.runNumber,event.eventNumber)); if(!res) { cout<<"DATABASE -- couldn't update file's path. Unsetting permanent flag"<Query(Form("UPDATE %s SET permanent = 0 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber)); delete res; return 0; } else { cout<<"DATABASE -- event marked"<Query(Form("UPDATE %s SET file_path = '%s' WHERE run_number = %d AND event_number = %d;",fTable.c_str(),newPath,event.runNumber,event.eventNumber)); if(!res) { cout<<"DATABASE -- couldn't update file's path"< AliStorageDatabase::GetList(struct listRequestStruct list) { TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE run_number >= %d AND run_number <= %d AND event_number >= %d AND event_number <= %d AND multiplicity >= %d AND multiplicity <= %d AND (permanent = %d OR permanent = %d) AND (system = '%s' OR system = '%s') ORDER BY run_number,event_number;", fTable.c_str(), list.runNumber[0], list.runNumber[1], list.eventNumber[0], list.eventNumber[1], list.multiplicity[0], list.multiplicity[1], list.marked[0], list.marked[1], list.system[0], list.system[1])); TSQLRow *row; vector eventsVector; while((row = result->Next())) { serverListStruct resultList; resultList.runNumber = atoi(row->GetField(0)); resultList.eventNumber = atoi(row->GetField(1)); strcpy(resultList.system, row->GetField(2)); resultList.multiplicity = atoi(row->GetField(3)); resultList.marked = atoi(row->GetField(4)); eventsVector.push_back(resultList); delete row; } delete result; return eventsVector; } AliESDEvent* AliStorageDatabase::GetEvent(struct eventStruct event) { cout<<"database - get event"<cd(Form("run%d",event.runNumber)); data = (AliESDEvent*)gDirectory->Get(Form("event%d;1",event.eventNumber)); tmpFile->Close(); delete tmpFile; return data; } void AliStorageDatabase::RemoveEvent(struct eventStruct event) { TSQLResult* res; res = fServer->Query(Form("DELETE FROM %s WHERE run_number = %d AND event_number = %d",fTable.c_str(),event.runNumber,event.eventNumber)); delete res; } void AliStorageDatabase::RemoveEventsWithPath(string path) { TSQLResult *res = fServer->Query(Form("DELETE FROM %s WHERE file_path = \"%s\";",fTable.c_str(),path.c_str())); delete res; } string AliStorageDatabase::GetFilePath(struct eventStruct event) { TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber)); TSQLRow *row; row = result->Next(); if(row) { string path(row->GetField(5)); delete row; return path; } else { return ""; } } AliESDEvent* AliStorageDatabase::GetNextEvent(struct eventStruct event) { cout<<"Database:"<Query(Form("SELECT * FROM %s ORDER BY run_number,event_number;",fTable.c_str())); TSQLRow *row; bool isCurrentEvent=false; struct eventStruct nextEvent; while((row = result->Next())) { if(isCurrentEvent) { nextEvent.runNumber = atoi(row->GetField(0)); nextEvent.eventNumber = atoi(row->GetField(1)); return GetEvent(nextEvent); } //if current event found if(atoi(row->GetField(0))==event.runNumber && atoi(row->GetField(1))==event.eventNumber) { isCurrentEvent=true; } delete row; } return NULL; } AliESDEvent* AliStorageDatabase::GetPrevEvent(struct eventStruct event) { TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number DESC;",fTable.c_str())); TSQLRow *row; bool isCurrentEvent=false; struct eventStruct nextEvent; while((row = result->Next())) { if(isCurrentEvent) { nextEvent.runNumber = atoi(row->GetField(0)); nextEvent.eventNumber = atoi(row->GetField(1)); return GetEvent(nextEvent); } //if current event found if(atoi(row->GetField(0))==event.runNumber && atoi(row->GetField(1))==event.eventNumber) { isCurrentEvent=true; } delete row; } delete result; return NULL; } struct eventStruct AliStorageDatabase::GetOldestEvent() { TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE permanent = 0 ORDER BY run_number,event_number;",fTable.c_str())); TSQLRow *row; struct eventStruct oldestEvent = {0,0}; if((row = result->Next())) { oldestEvent.runNumber = atoi(row->GetField(0)); oldestEvent.eventNumber = atoi(row->GetField(1)); delete row; } else { cout<<"DATABASE -- NO OLDEST EVENT FOUND. Storage may be corrupted."<Query(Form("SELECT * FROM %s ORDER BY run_number,event_number;",fTable.c_str())); TSQLRow *row; struct eventStruct lastEvent = {0,0}; while((row = result->Next())) { lastEvent.runNumber = atoi(row->GetField(0)); lastEvent.eventNumber = atoi(row->GetField(1)); delete row; } cout<<"Last event is:"<Query(Form("SELECT * FROM %s ORDER BY run_number,event_number DESC;",fTable.c_str())); TSQLRow *row; struct eventStruct firstEvent = {0,0}; while((row = result->Next())) { firstEvent.runNumber = atoi(row->GetField(0)); firstEvent.eventNumber = atoi(row->GetField(1)); delete row; } cout<<"First event is:"<