X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliCDBLocal.cxx;h=8074120278898d5f2ca5f17dcd340c1c9d258426;hb=2200238e75ed61675b4a8233bbf691ff787b8d82;hp=aae166900d9fa6ab5c16c206a01cc40d98741cf6;hpb=8e245d157c836ef9efc64f5a1a8bf9e77378d4c4;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliCDBLocal.cxx b/STEER/AliCDBLocal.cxx index aae166900d9..80741202788 100644 --- a/STEER/AliCDBLocal.cxx +++ b/STEER/AliCDBLocal.cxx @@ -20,6 +20,7 @@ // // ///////////////////////////////////////////////////////////////////////////////////////////////// +#include #include #include #include @@ -145,7 +146,7 @@ Bool_t AliCDBLocal::PrepareId(AliCDBId& id) { } const char* filename; - AliCDBRunRange aRunRange; // the runRange got from filename + AliCDBRunRange aRunRange; // the runRange got from filename AliCDBRunRange lastRunRange(-1,-1); // highest runRange found Int_t aVersion, aSubVersion; // the version subVersion got from filename Int_t lastVersion = 0, lastSubVersion = -1; // highest version and subVersion found @@ -232,9 +233,138 @@ Bool_t AliCDBLocal::PrepareId(AliCDBId& id) { return kTRUE; } +// //_____________________________________________________________________________ +// Bool_t AliCDBLocal::GetId(const AliCDBId& query, AliCDBId& result) { +// // look for filename matching query (called by GetEntry) +// +// TString dirName = Form("%s/%s", fBaseDirectory.Data(), query.GetPath().Data()); +// +// void* dirPtr = gSystem->OpenDirectory(dirName); +// if (!dirPtr) { +// AliDebug(2,Form("Directory <%s> not found", (query.GetPath()).Data())); +// AliDebug(2,Form("in DB folder %s", fBaseDirectory.Data())); +// return kFALSE; +// } +// +// const char* filename; +// +// AliCDBRunRange aRunRange; // the runRange got from filename +// Int_t aVersion, aSubVersion; // the version and subVersion got from filename +// +// if (!query.HasVersion()) { // neither version and subversion specified -> look for highest version and subVersion +// +// while ((filename = gSystem->GetDirEntry(dirPtr))) { // loop on files +// +// TString aString(filename); +// if (aString == "." || aString == "..") continue; +// +// if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue; +// // aRunRange, aVersion, aSubVersion filled from filename +// +// if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue; +// // aRunRange contains requested run! +// +// if (result.GetVersion() < aVersion) { +// result.SetVersion(aVersion); +// result.SetSubVersion(aSubVersion); +// +// result.SetFirstRun( +// aRunRange.GetFirstRun()); +// result.SetLastRun( +// aRunRange.GetLastRun()); +// +// } else if (result.GetVersion() == aVersion +// && result.GetSubVersion() +// < aSubVersion) { +// +// result.SetSubVersion(aSubVersion); +// +// result.SetFirstRun( +// aRunRange.GetFirstRun()); +// result.SetLastRun( +// aRunRange.GetLastRun()); +// } else if (result.GetVersion() == aVersion +// && result.GetSubVersion() == aSubVersion){ +// AliDebug(2,Form("More than one object valid for run %d, version %d_%d!", +// query.GetFirstRun(), aVersion, aSubVersion)); +// gSystem->FreeDirectory(dirPtr); +// return kFALSE; +// } +// } +// +// } else if (!query.HasSubVersion()) { // version specified but not subversion -> look for highest subVersion +// +// result.SetVersion(query.GetVersion()); +// +// while ((filename = gSystem->GetDirEntry(dirPtr))) { // loop on files +// +// TString aString(filename); +// if (aString == "." || aString == "..") continue; +// +// if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue; +// // aRunRange, aVersion, aSubVersion filled from filename +// +// if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue; +// // aRunRange contains requested run! +// +// if(query.GetVersion() != aVersion) continue; +// // aVersion is requested version! +// +// if(result.GetSubVersion() == aSubVersion){ +// AliDebug(2,Form("More than one object valid for run %d, version %d_%d!", +// query.GetFirstRun(), aVersion, aSubVersion)); +// gSystem->FreeDirectory(dirPtr); +// return kFALSE; +// } +// if( result.GetSubVersion() < aSubVersion) { +// +// result.SetSubVersion(aSubVersion); +// +// result.SetFirstRun( +// aRunRange.GetFirstRun()); +// result.SetLastRun( +// aRunRange.GetLastRun()); +// } +// } +// +// } else { // both version and subversion specified +// +// while ((filename = gSystem->GetDirEntry(dirPtr))) { // loop on files +// +// TString aString(filename); +// if (aString == "." || aString == "..") continue; +// +// if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue; +// // aRunRange, aVersion, aSubVersion filled from filename +// +// if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue; +// // aRunRange contains requested run! +// +// if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue; +// // aVersion and aSubVersion are requested version and subVersion! +// +// if(result.GetVersion() == aVersion && result.GetSubVersion() == aSubVersion){ +// AliDebug(2,Form("More than one object valid for run %d, version %d_%d!", +// query.GetFirstRun(), aVersion, aSubVersion)); +// gSystem->FreeDirectory(dirPtr); +// return kFALSE; +// } +// result.SetVersion(aVersion); +// result.SetSubVersion(aSubVersion); +// result.SetFirstRun(aRunRange.GetFirstRun()); +// result.SetLastRun(aRunRange.GetLastRun()); +// +// } +// } +// +// gSystem->FreeDirectory(dirPtr); +// +// return kTRUE; +// } + //_____________________________________________________________________________ -Bool_t AliCDBLocal::GetId(const AliCDBId& query, AliCDBId& result) { -// look for filename matching query (called by GetEntry) +AliCDBId* AliCDBLocal::GetId(const AliCDBId& query) { +// look for filename matching query (called by GetEntryId) TString dirName = Form("%s/%s", fBaseDirectory.Data(), query.GetPath().Data()); @@ -242,10 +372,12 @@ Bool_t AliCDBLocal::GetId(const AliCDBId& query, AliCDBId& result) { if (!dirPtr) { AliDebug(2,Form("Directory <%s> not found", (query.GetPath()).Data())); AliDebug(2,Form("in DB folder %s", fBaseDirectory.Data())); - return kFALSE; + return NULL; } const char* filename; + AliCDBId *result = new AliCDBId(); + result->SetPath(query.GetPath()); AliCDBRunRange aRunRange; // the runRange got from filename Int_t aVersion, aSubVersion; // the version and subVersion got from filename @@ -263,165 +395,190 @@ Bool_t AliCDBLocal::GetId(const AliCDBId& query, AliCDBId& result) { if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue; // aRunRange contains requested run! - if (result.GetVersion() < aVersion) { - result.SetVersion(aVersion); - result.SetSubVersion(aSubVersion); + if (result->GetVersion() < aVersion) { + result->SetVersion(aVersion); + result->SetSubVersion(aSubVersion); - result.SetFirstRun( + result->SetFirstRun( aRunRange.GetFirstRun()); - result.SetLastRun( + result->SetLastRun( aRunRange.GetLastRun()); - } else if (result.GetVersion() == aVersion - && result.GetSubVersion() + } else if (result->GetVersion() == aVersion + && result->GetSubVersion() < aSubVersion) { - result.SetSubVersion(aSubVersion); + result->SetSubVersion(aSubVersion); - result.SetFirstRun( + result->SetFirstRun( aRunRange.GetFirstRun()); - result.SetLastRun( + result->SetLastRun( aRunRange.GetLastRun()); - } else if (result.GetVersion() == aVersion - && result.GetSubVersion() == aSubVersion){ - AliDebug(2,Form("More than one object valid for run %d, version %d_%d!", + } else if (result->GetVersion() == aVersion + && result->GetSubVersion() == aSubVersion){ + AliError(Form("More than one object valid for run %d, version %d_%d!", query.GetFirstRun(), aVersion, aSubVersion)); gSystem->FreeDirectory(dirPtr); - return kFALSE; + delete result; + return NULL; } } - + } else if (!query.HasSubVersion()) { // version specified but not subversion -> look for highest subVersion - result.SetVersion(query.GetVersion()); + result->SetVersion(query.GetVersion()); while ((filename = gSystem->GetDirEntry(dirPtr))) { // loop on files TString aString(filename); if (aString == "." || aString == "..") continue; - if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue; + if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue; // aRunRange, aVersion, aSubVersion filled from filename if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue; // aRunRange contains requested run! - + if(query.GetVersion() != aVersion) continue; // aVersion is requested version! - - if(result.GetSubVersion() == aSubVersion){ - AliDebug(2,Form("More than one object valid for run %d, version %d_%d!", + + if(result->GetSubVersion() == aSubVersion){ + AliError(Form("More than one object valid for run %d, version %d_%d!", query.GetFirstRun(), aVersion, aSubVersion)); gSystem->FreeDirectory(dirPtr); - return kFALSE; + delete result; + return NULL; } - if( result.GetSubVersion() < aSubVersion) { + if( result->GetSubVersion() < aSubVersion) { - result.SetSubVersion(aSubVersion); + result->SetSubVersion(aSubVersion); - result.SetFirstRun( + result->SetFirstRun( aRunRange.GetFirstRun()); - result.SetLastRun( + result->SetLastRun( aRunRange.GetLastRun()); } } } else { // both version and subversion specified - while ((filename = gSystem->GetDirEntry(dirPtr))) { // loop on files + //AliCDBId dataId(queryId.GetAliCDBPath(), -1, -1, -1, -1); + //Bool_t result; + while ((filename = gSystem->GetDirEntry(dirPtr))) { // loop on files TString aString(filename); if (aString == "." || aString == "..") continue; if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue; // aRunRange, aVersion, aSubVersion filled from filename - + if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue; // aRunRange contains requested run! - if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue; + if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue; // aVersion and aSubVersion are requested version and subVersion! - - if(result.GetVersion() == aVersion && result.GetSubVersion() == aSubVersion){ - AliDebug(2,Form("More than one object valid for run %d, version %d_%d!", + + if(result->GetVersion() == aVersion && result->GetSubVersion() == aSubVersion){ + AliError(Form("More than one object valid for run %d, version %d_%d!", query.GetFirstRun(), aVersion, aSubVersion)); gSystem->FreeDirectory(dirPtr); - return kFALSE; + delete result; + return NULL; } - result.SetVersion(aVersion); - result.SetSubVersion(aSubVersion); - result.SetFirstRun(aRunRange.GetFirstRun()); - result.SetLastRun(aRunRange.GetLastRun()); + result->SetVersion(aVersion); + result->SetSubVersion(aSubVersion); + result->SetFirstRun(aRunRange.GetFirstRun()); + result->SetLastRun(aRunRange.GetLastRun()); } } gSystem->FreeDirectory(dirPtr); - return kTRUE; + return result; } //_____________________________________________________________________________ AliCDBEntry* AliCDBLocal::GetEntry(const AliCDBId& queryId) { // get AliCDBEntry from the database - AliCDBId dataId(queryId.GetAliCDBPath(), -1, -1, -1, -1); - Bool_t result; - - // look for a filename matching query requests (path, runRange, version, subVersion) - if (!queryId.HasVersion()) { - // if version is not specified, first check the selection criteria list - AliCDBId selectedId(queryId); - GetSelection(&selectedId); - result = GetId(selectedId, dataId); - } else { - result = GetId(queryId, dataId); - } + AliCDBId* dataId = GetEntryId(queryId); - if (!result || !dataId.IsSpecified()) return NULL; + if (!dataId || !dataId->IsSpecified()) return NULL; TString filename; - if (!IdToFilename(dataId, filename)) { + if (!IdToFilename(*dataId, filename)) { AliDebug(2,Form("Bad data ID encountered! Subnormal error!")); - return NULL; + delete dataId; + return NULL; } TFile file(filename, "READ"); // open file if (!file.IsOpen()) { AliDebug(2,Form("Can't open file <%s>!", filename.Data())); - return NULL; + delete dataId; + return NULL; } // get the only AliCDBEntry object from the file // the object in the file is an AliCDBEntry entry named "AliCDBEntry" - + AliCDBEntry* anEntry = dynamic_cast (file.Get("AliCDBEntry")); if (!anEntry) { AliDebug(2,Form("Bad storage data: No AliCDBEntry in file!")); file.Close(); + delete dataId; return NULL; } - AliCDBId entryId = anEntry->GetId(); - + AliCDBId& entryId = anEntry->GetId(); + // The object's Id are not reset during storage // If object's Id runRange or version do not match with filename, // it means that someone renamed file by hand. In this case a warning msg is issued. anEntry-> SetLastStorage("local"); - - if(!entryId.IsEqual(&dataId)){ + + if(!entryId.IsEqual(dataId)){ AliWarning(Form("Mismatch between file name and object's Id!")); - AliWarning(Form("File name: %s", dataId.ToString().Data())); + AliWarning(Form("File name: %s", dataId->ToString().Data())); AliWarning(Form("Object's Id: %s", entryId.ToString().Data())); } + // Check whether entry contains a TTree. In case load the tree in memory! + LoadTreeFromFile(anEntry); + // close file, return retieved entry file.Close(); + delete dataId; return anEntry; } +//_____________________________________________________________________________ +AliCDBId* AliCDBLocal::GetEntryId(const AliCDBId& queryId) { +// get AliCDBId from the database + + AliCDBId* dataId = 0; + + // look for a filename matching query requests (path, runRange, version, subVersion) + if (!queryId.HasVersion()) { + // if version is not specified, first check the selection criteria list + AliCDBId selectedId(queryId); + GetSelection(&selectedId); + dataId = GetId(selectedId); + } else { + dataId = GetId(queryId); + } + + if (dataId && !dataId->IsSpecified()) { + delete dataId; + return NULL; + } + + return dataId; +} + //_____________________________________________________________________________ void AliCDBLocal::GetEntriesForLevel0(const char* level0, const AliCDBId& queryId, TList* result) { @@ -437,13 +594,24 @@ void AliCDBLocal::GetEntriesForLevel0(const char* level0, } const char* level1; + Long_t flag=0; while ((level1 = gSystem->GetDirEntry(level0DirPtr))) { TString level1Str(level1); if (level1Str == "." || level1Str == "..") { continue; } + + TString fullPath = Form("%s/%s",level0Dir.Data(), level1); + Int_t res=gSystem->GetPathInfo(fullPath.Data(), 0, (Long64_t*) 0, &flag, 0); + + if(res){ + AliDebug(2, Form("Error reading entry %s !",level1Str.Data())); + continue; + } + if(!(flag&2)) continue; // bit 1 of flag = directory! + if (queryId.GetAliCDBPath().Level1Comprises(level1)) { GetEntriesForLevel1(level0, level1, queryId, result); } @@ -467,6 +635,7 @@ void AliCDBLocal::GetEntriesForLevel1(const char* level0, const char* level1, } const char* level2; + Long_t flag=0; while ((level2 = gSystem->GetDirEntry(level1DirPtr))) { TString level2Str(level2); @@ -474,6 +643,16 @@ void AliCDBLocal::GetEntriesForLevel1(const char* level0, const char* level1, continue; } + TString fullPath = Form("%s/%s",level1Dir.Data(), level2); + + Int_t res=gSystem->GetPathInfo(fullPath.Data(), 0, (Long64_t*) 0, &flag, 0); + + if(res){ + AliDebug(2, Form("Error reading entry %s !",level2Str.Data())); + continue; + } + if(!(flag&2)) continue; // bit 1 of flag = directory! + if (queryId.GetAliCDBPath().Level2Comprises(level2)) { AliCDBPath entryPath(level0, level1, level2); @@ -493,7 +672,7 @@ void AliCDBLocal::GetEntriesForLevel1(const char* level0, const char* level1, //_____________________________________________________________________________ TList* AliCDBLocal::GetEntries(const AliCDBId& queryId) { // multiple request (AliCDBStorage::GetAll) - + void* storageDirPtr = gSystem->OpenDirectory(fBaseDirectory); if (!storageDirPtr) { AliDebug(2,Form("Can't open storage directory <%s>", @@ -505,12 +684,24 @@ TList* AliCDBLocal::GetEntries(const AliCDBId& queryId) { result->SetOwner(); const char* level0; + Long_t flag=0; while ((level0 = gSystem->GetDirEntry(storageDirPtr))) { TString level0Str(level0); if (level0Str == "." || level0Str == "..") { continue; } + + TString fullPath = Form("%s/%s",fBaseDirectory.Data(), level0); + + Int_t res=gSystem->GetPathInfo(fullPath.Data(), 0, (Long64_t*) 0, &flag, 0); + + if(res){ + AliDebug(2, Form("Error reading entry %s !",level0Str.Data())); + continue; + } + + if(!(flag&2)) continue; // bit 1 of flag = directory! if (queryId.GetAliCDBPath().Level0Comprises(level0)) { GetEntriesForLevel0(level0, queryId, result); @@ -547,6 +738,8 @@ Bool_t AliCDBLocal::PutEntry(AliCDBEntry* entry) { return kFALSE; } + //SetTreeToFile(entry, &file); + entry->SetVersion(id.GetVersion()); entry->SetSubVersion(id.GetSubVersion()); @@ -702,11 +895,14 @@ Int_t AliCDBLocal::GetLatestVersion(const char* path, Int_t run){ } AliCDBId query(path, run, run, -1, -1); - AliCDBId dataId; + AliCDBId* dataId = GetId(query); - GetId(query,dataId); + if(!dataId) return -1; - return dataId.GetVersion(); + Int_t version = dataId->GetVersion(); + delete dataId; + + return version; } @@ -721,11 +917,14 @@ Int_t AliCDBLocal::GetLatestSubVersion(const char* path, Int_t run, Int_t versio } AliCDBId query(path, run, run, version, -1); - AliCDBId dataId; + AliCDBId *dataId = GetId(query); + + if(!dataId) return -1; - GetId(query,dataId); + Int_t subVersion = dataId->GetSubVersion(); - return dataId.GetSubVersion(); + delete dataId; + return subVersion; } @@ -762,7 +961,7 @@ AliCDBParam* AliCDBLocalFactory::CreateParameter(const char* dbString) { pathname.Prepend(TString(gSystem->WorkingDirectory()) + '/'); } - return new AliCDBLocalParam(pathname); + return new AliCDBLocalParam(pathname); } //_____________________________________________________________________________