1 #include "AliStorageDatabase.h"
7 #include <TSQLResult.h>
14 AliStorageDatabase::AliStorageDatabase() :
25 ifstream configFile (GetConfigFilePath());
26 if (configFile.is_open())
30 while(configFile.good())
32 getline(configFile,line);
33 from = line.find("\"")+1;
34 to = line.find_last_of("\"");
35 if(line.find("HOST=")==0){
36 fHost=line.substr(from,to-from);
38 else if(line.find("PORT=")==0){
39 fPort=line.substr(from,to-from);
41 else if(line.find("DATABASE=")==0){
42 fDatabase=line.substr(from,to-from);
44 else if(line.find("USER=")==0){
45 fUID=line.substr(from,to-from);
47 else if(line.find("PASS=")==0){
48 fPassword=line.substr(from,to-from);
50 else if(line.find("TABLE=")==0){
51 fTable=line.substr(from,to-from);
53 else if(line.find("STORAGE_PATH=")==0){
54 fStoragePath=line.substr(from,to-from);
58 if(configFile.eof()){configFile.clear();}
61 else{cout << "DATABASE -- Unable to open file" <<endl;}
64 cout<<"DATABASE -- connecting to server:"<<Form("mysql://%s:%s/%s",fHost.c_str(),fPort.c_str(),fDatabase.c_str())<<fUID.c_str()<<fPassword.c_str()<<endl;
65 fServer = TSQLServer::Connect(Form("mysql://%s:%s/%s",fHost.c_str(),fPort.c_str(),fDatabase.c_str()),fUID.c_str(),fPassword.c_str());
66 cout<<"Connected"<<endl;
69 AliStorageDatabase::~AliStorageDatabase(){
70 if (fServer) {delete fServer;}
73 void AliStorageDatabase::InsertEvent(int runNumber,
79 TSQLResult *res = fServer->Query(Form("select * FROM %s WHERE run_number = %d AND event_number = %d AND permanent = 1;",fTable.c_str(),runNumber,eventNumber));
80 TSQLRow *row = res->Next();
84 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));
91 bool AliStorageDatabase::MarkEvent(struct eventStruct event)
94 res = fServer->Query(Form("UPDATE %s SET permanent = 1 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber));
97 cout<<"DATABASE -- couldn't update permanent flag"<<endl;
103 cout<<"DATABASE -- permanent flag updated"<<endl;
105 res = fServer->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));
108 cout<<"DATABASE -- couldn't update file's path. Unsetting permanent flag"<<endl;
109 res = fServer->Query(Form("UPDATE %s SET permanent = 0 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber));
115 cout<<"DATABASE -- event marked"<<endl;
122 bool AliStorageDatabase::UpdateEventPath(struct eventStruct event,const char *newPath)
125 res = fServer->Query(Form("UPDATE %s SET file_path = '%s' WHERE run_number = %d AND event_number = %d;",fTable.c_str(),newPath,event.runNumber,event.eventNumber));
128 cout<<"DATABASE -- couldn't update file's path"<<endl;
134 cout<<"DATABASE -- path updated for event:"<<event.eventNumber<<endl;
141 vector<serverListStruct> AliStorageDatabase::GetList(struct listRequestStruct list)
143 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;",
149 list.multiplicity[0],
150 list.multiplicity[1],
158 vector<serverListStruct> eventsVector;
160 while((row = result->Next()))
162 serverListStruct resultList;
164 resultList.runNumber = atoi(row->GetField(0));
165 resultList.eventNumber = atoi(row->GetField(1));
166 strcpy(resultList.system, row->GetField(2));
167 resultList.multiplicity = atoi(row->GetField(3));
168 resultList.marked = atoi(row->GetField(4));
170 eventsVector.push_back(resultList);
177 AliESDEvent* AliStorageDatabase::GetEvent(struct eventStruct event)
179 cout<<"database - get event"<<endl;
180 string pathToFile = GetFilePath(event);
182 if(!strcmp(pathToFile.c_str(),""))
184 cout<<"DATABASE -- no such file in database"<<endl;
188 TFile *tmpFile = new TFile(pathToFile.c_str(),"read");
191 cout<<"DATABASE -- couldn't open temp file"<<endl;
195 tmpFile->cd(Form("run%d",event.runNumber));
196 data = (AliESDEvent*)gDirectory->Get(Form("event%d;1",event.eventNumber));
205 void AliStorageDatabase::RemoveEvent(struct eventStruct event)
208 res = fServer->Query(Form("DELETE FROM %s WHERE run_number = %d AND event_number = %d",fTable.c_str(),event.runNumber,event.eventNumber));
212 void AliStorageDatabase::RemoveEventsWithPath(string path)
214 TSQLResult *res = fServer->Query(Form("DELETE FROM %s WHERE file_path = \"%s\";",fTable.c_str(),path.c_str()));
218 string AliStorageDatabase::GetFilePath(struct eventStruct event)
220 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber));
222 row = result->Next();
225 string path(row->GetField(5));
235 AliESDEvent* AliStorageDatabase::GetNextEvent(struct eventStruct event)
237 cout<<"Database:"<<event.runNumber<<"\t"<<event.eventNumber<<endl;
239 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number;",fTable.c_str()));
242 bool isCurrentEvent=false;
243 struct eventStruct nextEvent;
245 while((row = result->Next()))
249 nextEvent.runNumber = atoi(row->GetField(0));
250 nextEvent.eventNumber = atoi(row->GetField(1));
251 return GetEvent(nextEvent);
254 //if current event found
255 if(atoi(row->GetField(0))==event.runNumber && atoi(row->GetField(1))==event.eventNumber)
266 AliESDEvent* AliStorageDatabase::GetPrevEvent(struct eventStruct event)
268 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number DESC;",fTable.c_str()));
271 bool isCurrentEvent=false;
272 struct eventStruct nextEvent;
274 while((row = result->Next()))
278 nextEvent.runNumber = atoi(row->GetField(0));
279 nextEvent.eventNumber = atoi(row->GetField(1));
280 return GetEvent(nextEvent);
283 //if current event found
284 if(atoi(row->GetField(0))==event.runNumber && atoi(row->GetField(1))==event.eventNumber)
295 struct eventStruct AliStorageDatabase::GetOldestEvent()
297 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE permanent = 0 ORDER BY run_number,event_number;",fTable.c_str()));
300 struct eventStruct oldestEvent = {0,0};
302 if((row = result->Next()))
304 oldestEvent.runNumber = atoi(row->GetField(0));
305 oldestEvent.eventNumber = atoi(row->GetField(1));
310 cout<<"DATABASE -- NO OLDEST EVENT FOUND. Storage may be corrupted."<<endl;
315 AliESDEvent* AliStorageDatabase::GetLastEvent()
317 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number;",fTable.c_str()));
320 struct eventStruct lastEvent = {0,0};
322 while((row = result->Next()))
324 lastEvent.runNumber = atoi(row->GetField(0));
325 lastEvent.eventNumber = atoi(row->GetField(1));
328 cout<<"Last event is:"<<lastEvent.eventNumber<<endl;
329 return GetEvent(lastEvent);
333 AliESDEvent* AliStorageDatabase::GetFirstEvent()
335 cout<<"Database - first"<<endl;
336 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number DESC;",fTable.c_str()));
339 struct eventStruct firstEvent = {0,0};
341 while((row = result->Next()))
343 firstEvent.runNumber = atoi(row->GetField(0));
344 firstEvent.eventNumber = atoi(row->GetField(1));
347 cout<<"First event is:"<<firstEvent.eventNumber<<endl;
348 return GetEvent(firstEvent);