1 #include "AliStorageDatabase.h"
7 #include <TSQLResult.h>
14 AliStorageDatabase::AliStorageDatabase() :
25 ifstream configFile (GetConfigFilePath());
28 if (configFile.is_open())
32 while(configFile.good())
34 getline(configFile,line);
35 from = line.find("\"")+1;
36 to = line.find_last_of("\"");
37 if(line.find("HOST=")==0)
39 fHost=line.substr(from,to-from);
41 else if(line.find("PORT=")==0)
43 fPort=line.substr(from,to-from);
45 else if(line.find("DATABASE=")==0)
47 fDatabase=line.substr(from,to-from);
49 else if(line.find("USER=")==0)
51 fUID=line.substr(from,to-from);
53 else if(line.find("PASS=")==0)
55 fPassword=line.substr(from,to-from);
57 else if(line.find("TABLE=")==0)
59 fTable=line.substr(from,to-from);
61 else if(line.find("STORAGE_PATH=")==0)
63 fStoragePath=line.substr(from,to-from);
75 cout << "DATABASE -- Unable to open file" <<endl;
80 fServer = TSQLServer::Connect(Form("mysql://%s:%s/%s",fHost.c_str(),fPort.c_str(),fDatabase.c_str()),fUID.c_str(),fPassword.c_str());
83 AliStorageDatabase::~AliStorageDatabase(){
84 if (fServer) {delete fServer;}
87 void AliStorageDatabase::InsertEvent(int runNumber,
94 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));
99 bool AliStorageDatabase::MarkEvent(struct eventStruct event)
102 res = fServer->Query(Form("UPDATE %s SET permanent = 1 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber));
105 cout<<"DATABASE -- couldn't update permanent flag"<<endl;
111 cout<<"DATABASE -- permanent flag updated"<<endl;
113 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));
116 cout<<"DATABASE -- couldn't update file's path. Unsetting permanent flag"<<endl;
117 res = fServer->Query(Form("UPDATE %s SET permanent = 0 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber));
123 cout<<"DATABASE -- event marked"<<endl;
130 bool AliStorageDatabase::UpdateEventPath(struct eventStruct event,const char *newPath)
133 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));
136 cout<<"DATABASE -- couldn't update file's path"<<endl;
142 cout<<"DATABASE -- path updated for event:"<<event.eventNumber<<endl;
149 vector<serverListStruct> AliStorageDatabase::GetList(struct listRequestStruct list)
151 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;",
157 list.multiplicity[0],
158 list.multiplicity[1],
166 vector<serverListStruct> eventsVector;
168 while((row = result->Next()))
170 serverListStruct resultList;
172 resultList.runNumber = atoi(row->GetField(0));
173 resultList.eventNumber = atoi(row->GetField(1));
174 strcpy(resultList.system, row->GetField(2));
175 resultList.multiplicity = atoi(row->GetField(3));
176 resultList.marked = atoi(row->GetField(4));
178 eventsVector.push_back(resultList);
185 AliESDEvent* AliStorageDatabase::GetEvent(struct eventStruct event)
187 cout<<"database - get event"<<endl;
188 string pathToFile = GetFilePath(event);
190 if(!strcmp(pathToFile.c_str(),""))
192 cout<<"DATABASE -- no such file in database"<<endl;
196 TFile *tmpFile = new TFile(pathToFile.c_str(),"read");
199 cout<<"DATABASE -- couldn't open temp file"<<endl;
203 tmpFile->cd(Form("run%d",event.runNumber));
204 data = (AliESDEvent*)gDirectory->Get(Form("event%d;1",event.eventNumber));
207 // tmpFile->GetObject(Form("event%d;1",event.eventNumber),data);
212 void AliStorageDatabase::RemoveEvent(struct eventStruct event)
215 res = fServer->Query(Form("DELETE FROM %s WHERE run_number = %d AND event_number = %d",fTable.c_str(),event.runNumber,event.eventNumber));
219 void AliStorageDatabase::RemoveEventsWithPath(string path)
221 TSQLResult *res = fServer->Query(Form("DELETE FROM %s WHERE file_path = \"%s\";",fTable.c_str(),path.c_str()));
225 string AliStorageDatabase::GetFilePath(struct eventStruct event)
227 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber));
229 row = result->Next();
232 string path(row->GetField(5));
242 AliESDEvent* AliStorageDatabase::GetNextEvent(struct eventStruct event)
244 cout<<"Database:"<<event.runNumber<<"\t"<<event.eventNumber<<endl;
246 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number;",fTable.c_str()));
249 bool isCurrentEvent=false;
250 struct eventStruct nextEvent;
252 while((row = result->Next()))
256 nextEvent.runNumber = atoi(row->GetField(0));
257 nextEvent.eventNumber = atoi(row->GetField(1));
258 return GetEvent(nextEvent);
261 //if current event found
262 if(atoi(row->GetField(0))==event.runNumber && atoi(row->GetField(1))==event.eventNumber)
273 AliESDEvent* AliStorageDatabase::GetPrevEvent(struct eventStruct event)
275 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number DESC;",fTable.c_str()));
278 bool isCurrentEvent=false;
279 struct eventStruct nextEvent;
281 while((row = result->Next()))
285 nextEvent.runNumber = atoi(row->GetField(0));
286 nextEvent.eventNumber = atoi(row->GetField(1));
287 return GetEvent(nextEvent);
290 //if current event found
291 if(atoi(row->GetField(0))==event.runNumber && atoi(row->GetField(1))==event.eventNumber)
302 struct eventStruct AliStorageDatabase::GetOldestEvent()
304 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE permanent = 0 ORDER BY run_number,event_number;",fTable.c_str()));
307 struct eventStruct oldestEvent = {0,0};
309 if((row = result->Next()))
311 oldestEvent.runNumber = atoi(row->GetField(0));
312 oldestEvent.eventNumber = atoi(row->GetField(1));
317 cout<<"DATABASE -- NO OLDEST EVENT FOUND. Storage may be corrupted."<<endl;
322 AliESDEvent* AliStorageDatabase::GetLastEvent()
324 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number;",fTable.c_str()));
327 struct eventStruct lastEvent = {0,0};
329 while((row = result->Next()))
331 lastEvent.runNumber = atoi(row->GetField(0));
332 lastEvent.eventNumber = atoi(row->GetField(1));
335 cout<<"Last event is:"<<lastEvent.eventNumber<<endl;
336 return GetEvent(lastEvent);
340 AliESDEvent* AliStorageDatabase::GetFirstEvent()
342 cout<<"Database - first"<<endl;
343 TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number DESC;",fTable.c_str()));
346 struct eventStruct firstEvent = {0,0};
348 while((row = result->Next()))
350 firstEvent.runNumber = atoi(row->GetField(0));
351 firstEvent.eventNumber = atoi(row->GetField(1));
354 cout<<"First event is:"<<firstEvent.eventNumber<<endl;
355 return GetEvent(firstEvent);