#include <cstdlib>
#include <stdexcept>
#include <fstream>
#include <TSystem.h>
#include <TObjString.h>
#include <TRegexp.h>
#include <TFile.h>
#include <TKey.h>
#include "AliCDBLocal.h"
#include "AliCDBEntry.h"
#include "AliLog.h"
using namespace std;
ClassImp(AliCDBLocal)
AliCDBLocal::AliCDBLocal(const char* baseDir):
fBaseDirectory(baseDir)
{
AliDebug(1, Form("fBaseDirectory = %s",fBaseDirectory.Data()));
void* dir = gSystem->OpenDirectory(baseDir);
if (dir == NULL) {
if (gSystem->mkdir(baseDir, kTRUE)) {
AliError(Form("Can't open directory <%s>!", baseDir));
}
} else {
AliDebug(2,Form("Folder <%s> found",fBaseDirectory.Data()));
gSystem->FreeDirectory(dir);
}
fType="local";
fBaseFolder = fBaseDirectory;
}
AliCDBLocal::~AliCDBLocal() {
}
Bool_t AliCDBLocal::FilenameToId(const char* filename, AliCDBRunRange& runRange,
Int_t& version, Int_t& subVersion) {
Ssiz_t mSize;
TRegexp keyPattern("^Run[0-9]+_[0-9]+_v[0-9]+_s[0-9]+.root$");
keyPattern.Index(filename, &mSize);
if (!mSize) {
AliDebug(2, Form("Bad filename <%s>.", filename));
return kFALSE;
}
TString idString(filename);
idString.Resize(idString.Length() - sizeof(".root") + 1);
TObjArray* strArray = (TObjArray*) idString.Tokenize("_");
TString firstRunString(((TObjString*) strArray->At(0))->GetString());
runRange.SetFirstRun(atoi(firstRunString.Data() + 3));
runRange.SetLastRun(atoi(((TObjString*) strArray->At(1))->GetString()));
TString verString(((TObjString*) strArray->At(2))->GetString());
version = atoi(verString.Data() + 1);
TString subVerString(((TObjString*) strArray->At(3))->GetString());
subVersion = atoi(subVerString.Data() + 1);
delete strArray;
return kTRUE;
}
Bool_t AliCDBLocal::IdToFilename(const AliCDBId& id, TString& filename) const {
AliDebug(1, Form("fBaseDirectory = %s",fBaseDirectory.Data()));
if (!id.GetAliCDBRunRange().IsValid()) {
AliDebug(2,Form("Invalid run range <%d, %d>.",
id.GetFirstRun(), id.GetLastRun()));
return kFALSE;
}
if (id.GetVersion() < 0) {
AliDebug(2,Form("Invalid version <%d>.", id.GetVersion()));
return kFALSE;
}
if (id.GetSubVersion() < 0) {
AliDebug(2,Form("Invalid subversion <%d>.", id.GetSubVersion()));
return kFALSE;
}
filename = Form("Run%d_%d_v%d_s%d.root", id.GetFirstRun(), id.GetLastRun(),
id.GetVersion(), id.GetSubVersion());
filename.Prepend(fBaseDirectory +'/' + id.GetPath() + '/');
return kTRUE;
}
Bool_t AliCDBLocal::PrepareId(AliCDBId& id) {
TString dirName = Form("%s/%s", fBaseDirectory.Data(), id.GetPath().Data());
void* dirPtr = gSystem->OpenDirectory(dirName);
if (!dirPtr) {
gSystem->mkdir(dirName, kTRUE);
dirPtr = gSystem->OpenDirectory(dirName);
if (!dirPtr) {
AliError(Form("Can't create directory <%s>!",
dirName.Data()));
return kFALSE;
}
}
const char* filename;
AliCDBRunRange aRunRange;
AliCDBRunRange lastRunRange(-1,-1);
Int_t aVersion, aSubVersion;
Int_t lastVersion = 0, lastSubVersion = -1;
if (!id.HasVersion()) {
while ((filename = gSystem->GetDirEntry(dirPtr))) {
TString aString(filename);
if (aString == "." || aString == "..") continue;
if (!FilenameToId(filename, aRunRange, aVersion,
aSubVersion)) {
AliDebug(2,Form(
"Bad filename <%s>! I'll skip it.",
filename));
continue;
}
if (!aRunRange.Overlaps(id.GetAliCDBRunRange())) continue;
if(aVersion < lastVersion) continue;
if(aVersion > lastVersion) lastSubVersion = -1;
if(aSubVersion < lastSubVersion) continue;
lastVersion = aVersion;
lastSubVersion = aSubVersion;
lastRunRange = aRunRange;
}
id.SetVersion(lastVersion);
id.SetSubVersion(lastSubVersion + 1);
} else {
while ((filename = gSystem->GetDirEntry(dirPtr))) {
TString aString(filename);
if (aString == "." || aString == "..") {
continue;
}
if (!FilenameToId(filename, aRunRange, aVersion,
aSubVersion)) {
AliDebug(2,Form(
"Bad filename <%s>!I'll skip it.",
filename));
continue;
}
if (aRunRange.Overlaps(id.GetAliCDBRunRange())
&& aVersion == id.GetVersion()
&& aSubVersion > lastSubVersion) {
lastSubVersion = aSubVersion;
lastRunRange = aRunRange;
}
}
id.SetSubVersion(lastSubVersion + 1);
}
gSystem->FreeDirectory(dirPtr);
TString lastStorage = id.GetLastStorage();
if(lastStorage.Contains(TString("grid"), TString::kIgnoreCase) &&
id.GetSubVersion() > 0 ){
AliError(Form("Grid to Local Storage error! local object with version v%d_s%d found:",id.GetVersion(), id.GetSubVersion()-1));
AliError(Form("This object has been already transferred from Grid (check v%d_s0)!",id.GetVersion()));
return kFALSE;
}
if(lastStorage.Contains(TString("new"), TString::kIgnoreCase) &&
id.GetSubVersion() > 0 ){
AliDebug(2, Form("A NEW object is being stored with version v%d_s%d",
id.GetVersion(),id.GetSubVersion()));
AliDebug(2, Form("and it will hide previously stored object with v%d_s%d!",
id.GetVersion(),id.GetSubVersion()-1));
}
if(!lastRunRange.IsAnyRange() && !(lastRunRange.IsEqual(& id.GetAliCDBRunRange())))
AliWarning(Form("Run range modified w.r.t. previous version (Run%d_%d_v%d_s%d)",
lastRunRange.GetFirstRun(), lastRunRange.GetLastRun(),
id.GetVersion(), id.GetSubVersion()-1));
return kTRUE;
}
AliCDBId* AliCDBLocal::GetId(const AliCDBId& query) {
if(!AliCDBManager::Instance()->GetCvmfsOcdbTag().IsNull() && query.GetFirstRun() == fRun && !query.HasVersion()) {
TIter iter(&fValidFileIds);
AliCDBId *anIdPtr=0;
AliCDBId* result=0;
while((anIdPtr = dynamic_cast<AliCDBId*> (iter.Next()))){
if(anIdPtr->GetPath() == query.GetPath()){
result = new AliCDBId(*anIdPtr);
break;
}
}
return result;
}
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 NULL;
}
const char* filename;
AliCDBId *result = new AliCDBId();
result->SetPath(query.GetPath());
AliCDBRunRange aRunRange;
Int_t aVersion, aSubVersion;
if (!query.HasVersion()) {
while ((filename = gSystem->GetDirEntry(dirPtr))) {
TString aString(filename);
if (aString.BeginsWith('.')) continue;
if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue;
if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
AliDebug(1,Form("Filename %s matches\n",filename));
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){
AliError(Form("More than one object valid for run %d, version %d_%d!",
query.GetFirstRun(), aVersion, aSubVersion));
gSystem->FreeDirectory(dirPtr);
delete result;
return NULL;
}
}
} else if (!query.HasSubVersion()) {
result->SetVersion(query.GetVersion());
while ((filename = gSystem->GetDirEntry(dirPtr))) {
TString aString(filename);
if (aString.BeginsWith('.')) continue;
if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) continue;
if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
if(query.GetVersion() != aVersion) continue;
if(result->GetSubVersion() == aSubVersion){
AliError(Form("More than one object valid for run %d, version %d_%d!",
query.GetFirstRun(), aVersion, aSubVersion));
gSystem->FreeDirectory(dirPtr);
delete result;
return NULL;
}
if( result->GetSubVersion() < aSubVersion) {
result->SetSubVersion(aSubVersion);
result->SetFirstRun(
aRunRange.GetFirstRun());
result->SetLastRun(
aRunRange.GetLastRun());
}
}
} else {
while ((filename = gSystem->GetDirEntry(dirPtr))) {
TString aString(filename);
if (aString.BeginsWith('.')) continue;
if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)){
AliDebug(5, Form("Could not make id from file: %s", filename));
continue;
}
if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion){
continue;
}
result->SetVersion(aVersion);
result->SetSubVersion(aSubVersion);
result->SetFirstRun(aRunRange.GetFirstRun());
result->SetLastRun(aRunRange.GetLastRun());
break;
}
}
gSystem->FreeDirectory(dirPtr);
return result;
}
AliCDBEntry* AliCDBLocal::GetEntry(const AliCDBId& queryId) {
AliCDBId* dataId = GetEntryId(queryId);
TString errMessage(TString::Format("No valid CDB object found! request was: %s", queryId.ToString().Data()));
if (!dataId || !dataId->IsSpecified()){
AliError(Form("No file found matching this id!"));
throw std::runtime_error(errMessage.Data());
return NULL;
}
TString filename;
if (!IdToFilename(*dataId, filename)) {
AliError(Form("Bad data ID encountered!"));
delete dataId;
throw std::runtime_error(errMessage.Data());
return NULL;
}
TFile file(filename, "READ");
if (!file.IsOpen()) {
AliError(Form("Can't open file <%s>!", filename.Data()));
delete dataId;
throw std::runtime_error(errMessage.Data());
return NULL;
}
AliCDBEntry* anEntry = dynamic_cast<AliCDBEntry*> (file.Get("AliCDBEntry"));
if (!anEntry) {
AliError(Form("Bad storage data: No AliCDBEntry in file!"));
file.Close();
delete dataId;
throw std::runtime_error(errMessage.Data());
return NULL;
}
AliCDBId& entryId = anEntry->GetId();
anEntry-> SetLastStorage("local");
if(!entryId.IsEqual(dataId)){
AliWarning(Form("Mismatch between file name and object's Id!"));
AliWarning(Form("File name: %s", dataId->ToString().Data()));
AliWarning(Form("Object's Id: %s", entryId.ToString().Data()));
}
LoadTreeFromFile(anEntry);
file.Close();
delete dataId;
return anEntry;
}
AliCDBId* AliCDBLocal::GetEntryId(const AliCDBId& queryId) {
AliCDBId* dataId = 0;
if (!queryId.HasVersion()) {
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) {
TString level0Dir = Form("%s/%s", fBaseDirectory.Data(), level0);
void* level0DirPtr = gSystem->OpenDirectory(level0Dir);
if (!level0DirPtr) {
AliDebug(2,Form("Can't open level0 directory <%s>!",
level0Dir.Data()));
return;
}
const char* level1;
Long_t flag=0;
while ((level1 = gSystem->GetDirEntry(level0DirPtr))) {
TString level1Str(level1);
if (level1Str.BeginsWith('.')) {
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;
if (queryId.GetAliCDBPath().Level1Comprises(level1)) {
GetEntriesForLevel1(level0, level1, queryId, result);
}
}
gSystem->FreeDirectory(level0DirPtr);
}
void AliCDBLocal::GetEntriesForLevel1(const char* level0, const char* level1,
const AliCDBId& queryId, TList* result) {
TString level1Dir = Form("%s/%s/%s", fBaseDirectory.Data(), level0,level1);
void* level1DirPtr = gSystem->OpenDirectory(level1Dir);
if (!level1DirPtr) {
AliDebug(2,Form("Can't open level1 directory <%s>!",
level1Dir.Data()));
return;
}
const char* level2;
Long_t flag=0;
while ((level2 = gSystem->GetDirEntry(level1DirPtr))) {
TString level2Str(level2);
if (level2Str.BeginsWith('.')) {
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;
if (queryId.GetAliCDBPath().Level2Comprises(level2)) {
AliCDBPath entryPath(level0, level1, level2);
AliCDBId entryId(entryPath, queryId.GetAliCDBRunRange(),
queryId.GetVersion(), queryId.GetSubVersion());
void* level2DirPtr = gSystem->OpenDirectory(fullPath);
if (!level2DirPtr) {
AliDebug(2,Form("Can't open level2 directory <%s>!", fullPath.Data()));
return;
}
const char* level3;
Long_t file_flag=0;
while ((level3 = gSystem->GetDirEntry(level2DirPtr))) {
TString fileName(level3);
TString fullFileName = Form("%s/%s", fullPath.Data(), level3);
Int_t file_res=gSystem->GetPathInfo(fullFileName.Data(), 0, (Long64_t*) 0, &file_flag, 0);
if(file_res){
AliDebug(2, Form("Error reading entry %s !",level2Str.Data()));
continue;
}
if(file_flag)
continue;
Bool_t alreadyLoaded = kFALSE;
Int_t nEntries = result->GetEntries();
for(int i=0; i<nEntries; i++){
AliCDBEntry *lEntry = (AliCDBEntry*) result->At(i);
AliCDBId lId = lEntry->GetId();
TString lPath = lId.GetPath();
if(lPath.EqualTo(entryPath.GetPath())){
alreadyLoaded = kTRUE;
break;
}
}
if (alreadyLoaded) continue;
TRegexp re("^Run[0-9]+_[0-9]+_");
if(!fileName.Contains(re))
continue;
TString fn = fileName( 3, fileName.Length()-3 );
TString firstRunStr = fn( 0, fn.First('_') );
fn.Remove( 0, firstRunStr.Length()+1 );
TString lastRunStr = fn( 0, fn.First('_') );
fn.Remove( 0, lastRunStr.Length()+1 );
TString versionStr = fn( 1, fn.First('_')-1 );
fn.Remove( 0, versionStr.Length()+2 );
TString subvStr = fn(1, fn.First('.')-1);
Int_t firstRun = firstRunStr.Atoi();
Int_t lastRun = lastRunStr.Atoi();
AliCDBRunRange rr(firstRun,lastRun);
Int_t version = versionStr.Atoi();
Int_t subVersion = subvStr.Atoi();
AliCDBEntry* anEntry = 0;
Bool_t versionOK = kTRUE, subVersionOK = kTRUE;
if ( queryId.HasVersion() && version!=queryId.GetVersion())
versionOK = kFALSE;
if ( queryId.HasSubVersion() && subVersion!=queryId.GetSubVersion())
subVersionOK = kFALSE;
if (rr.Comprises(queryId.GetAliCDBRunRange()) && versionOK && subVersionOK )
{
anEntry = GetEntry(entryId);
result->Add(anEntry);
}
}
}
}
gSystem->FreeDirectory(level1DirPtr);
}
TList* AliCDBLocal::GetEntries(const AliCDBId& queryId) {
TList* result = new TList();
result->SetOwner();
if(queryId.GetFirstRun() == fRun && !queryId.HasVersion()) {
TIter *iter = new TIter(&fValidFileIds);
TObjArray selectedIds;
selectedIds.SetOwner(1);
AliCDBId* anIdPtr=0;
AliCDBId* dataId=0;
AliCDBPath queryPath = queryId.GetAliCDBPath();
while((anIdPtr = dynamic_cast<AliCDBId*> (iter->Next()))){
AliCDBPath thisCDBPath = anIdPtr->GetAliCDBPath();
if(!(queryPath.Comprises(thisCDBPath))){
continue;
}
AliCDBId thisId(*anIdPtr);
dataId = GetId(thisId);
if(dataId)
selectedIds.Add(dataId);
}
delete iter; iter=0;
iter = new TIter(&selectedIds);
while((anIdPtr = dynamic_cast<AliCDBId*> (iter->Next()))){
AliCDBEntry* anEntry = GetEntry(*anIdPtr);
if(anEntry) result->Add(anEntry);
}
delete iter; iter=0;
return result;
}
void* storageDirPtr = gSystem->OpenDirectory(fBaseDirectory);
if (!storageDirPtr) {
AliDebug(2,Form("Can't open storage directory <%s>",
fBaseDirectory.Data()));
return NULL;
}
const char* level0;
Long_t flag=0;
while ((level0 = gSystem->GetDirEntry(storageDirPtr))) {
TString level0Str(level0);
if (level0Str.BeginsWith('.')) {
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;
if (queryId.GetAliCDBPath().Level0Comprises(level0)) {
GetEntriesForLevel0(level0, queryId, result);
}
}
gSystem->FreeDirectory(storageDirPtr);
return result;
}
Bool_t AliCDBLocal::PutEntry(AliCDBEntry* entry, const char* mirrors) {
AliCDBId& id = entry->GetId();
if (!PrepareId(id)) return kFALSE;
TString filename="";
if (!IdToFilename(id, filename)) {
AliDebug(2,Form("Bad ID encountered! Subnormal error!"));
return kFALSE;
}
TString mirrorsString(mirrors);
if(!mirrorsString.IsNull())
AliWarning("AliCDBLocal storage cannot take mirror SEs into account. They will be ignored.");
TFile file(filename, "CREATE");
if (!file.IsOpen()) {
AliError(Form("Can't open file <%s>!", filename.Data()));
return kFALSE;
}
entry->SetVersion(id.GetVersion());
entry->SetSubVersion(id.GetSubVersion());
Bool_t result = file.WriteTObject(entry, "AliCDBEntry");
if (!result) AliDebug(2,Form("Can't write entry to file: %s", filename.Data()));
file.Close();
if(result) {
if(!(id.GetPath().Contains("SHUTTLE/STATUS")))
AliInfo(Form("CDB object stored into file %s",filename.Data()));
}
return result;
}
TList* AliCDBLocal::GetIdListFromFile(const char* fileName){
TString fullFileName(fileName);
fullFileName.Prepend(fBaseDirectory+'/');
TFile *file = TFile::Open(fullFileName);
if (!file) {
AliError(Form("Can't open selection file <%s>!", fullFileName.Data()));
return NULL;
}
file->cd();
TList *list = new TList();
list->SetOwner();
int i=0;
TString keycycle;
AliCDBId *id;
while(1){
i++;
keycycle = "AliCDBId;";
keycycle+=i;
id = (AliCDBId*) file->Get(keycycle);
if(!id) break;
list->AddFirst(id);
}
file->Close(); delete file; file=0;
return list;
}
Bool_t AliCDBLocal::Contains(const char* path) const{
TString dirName = Form("%s/%s", fBaseDirectory.Data(), path);
Bool_t result=kFALSE;
void* dirPtr = gSystem->OpenDirectory(dirName);
if (dirPtr) result=kTRUE;
gSystem->FreeDirectory(dirPtr);
return result;
}
void AliCDBLocal::QueryValidFiles() {
if(fVersion != -1) AliWarning ("Version parameter is not used by local storage query!");
if(fMetaDataFilter) {
AliWarning ("CDB meta data parameters are not used by local storage query!");
delete fMetaDataFilter; fMetaDataFilter=0;
}
TString cvmfsOcdbTag(gSystem->Getenv("OCDB_PATH"));
if (!cvmfsOcdbTag.IsNull()) {
QueryValidCVMFSFiles(cvmfsOcdbTag);
return;
}
void* storageDirPtr = gSystem->OpenDirectory(fBaseDirectory);
const char* level0;
while ((level0 = gSystem->GetDirEntry(storageDirPtr))) {
TString level0Str(level0);
if (level0Str.BeginsWith(".")) {
continue;
}
if (fPathFilter.Level0Comprises(level0)) {
TString level0Dir = Form("%s/%s",fBaseDirectory.Data(),level0);
void* level0DirPtr = gSystem->OpenDirectory(level0Dir);
const char* level1;
while ((level1 = gSystem->GetDirEntry(level0DirPtr))) {
TString level1Str(level1);
if (level1Str.BeginsWith(".")) {
continue;
}
if (fPathFilter.Level1Comprises(level1)) {
TString level1Dir = Form("%s/%s/%s",
fBaseDirectory.Data(),level0,level1);
void* level1DirPtr = gSystem->OpenDirectory(level1Dir);
const char* level2;
while ((level2 = gSystem->GetDirEntry(level1DirPtr))) {
TString level2Str(level2);
if (level2Str.BeginsWith(".")) {
continue;
}
if (fPathFilter.Level2Comprises(level2)) {
TString dirName = Form("%s/%s/%s/%s", fBaseDirectory.Data(), level0, level1, level2);
void* dirPtr = gSystem->OpenDirectory(dirName);
const char* filename;
AliCDBRunRange aRunRange;
AliCDBRunRange hvRunRange;
Int_t aVersion, aSubVersion;
Int_t highestV=-1, highestSubV=-1;
while ((filename = gSystem->GetDirEntry(dirPtr))) {
TString aString(filename);
if (aString.BeginsWith(".")) continue;
if (!FilenameToId(filename, aRunRange, aVersion, aSubVersion)) {
continue;
}
AliCDBRunRange runrg(fRun, fRun);
if (!aRunRange.Comprises(runrg))
continue;
if (aVersion > highestV) {
highestV = aVersion;
highestSubV = aSubVersion;
hvRunRange = aRunRange;
} else if (aVersion == highestV) {
if (aSubVersion > highestSubV) {
highestSubV = aSubVersion;
hvRunRange = aRunRange;
}
}
}
if(highestV >= 0){
AliCDBPath validPath(level0, level1, level2);
AliCDBId *validId = new AliCDBId(validPath, hvRunRange, highestV, highestSubV);
fValidFileIds.AddLast(validId);
}
gSystem->FreeDirectory(dirPtr);
}
}
gSystem->FreeDirectory(level1DirPtr);
}
}
gSystem->FreeDirectory(level0DirPtr);
}
}
gSystem->FreeDirectory(storageDirPtr);
}
void AliCDBLocal::QueryValidCVMFSFiles(TString& cvmfsOcdbTag) {
TString command = cvmfsOcdbTag;
AliDebug(3, Form("Getting valid files from CVMFS-OCDB tag \"%s\"", cvmfsOcdbTag.Data()));
cvmfsOcdbTag.Strip(TString::kTrailing, '/');
cvmfsOcdbTag.Append("/");
gSystem->ExpandPathName(cvmfsOcdbTag);
if ( gSystem->AccessPathName(cvmfsOcdbTag) )
AliFatal(Form("cvmfs OCDB set to an invalid path: %s", cvmfsOcdbTag.Data()));
command = command.Strip(TString::kTrailing, '/');
command.Append("/bin/getOCDBFilesPerRun.sh ");
command += cvmfsOcdbTag;
TString uri(GetURI());
uri.Remove(TString::kTrailing, '/');
TObjArray * osArr = uri.Tokenize('/');
TObjString* mcdata_os = dynamic_cast<TObjString*>(osArr->At(osArr->GetEntries()-3));
TObjString* yeartype_os = 0;
TString mcdata = mcdata_os->GetString();
if( mcdata == TString("data")) {
yeartype_os = dynamic_cast<TObjString*>(osArr->At(osArr->GetEntries()-2));
} else {
mcdata_os = dynamic_cast<TObjString*>(osArr->At(osArr->GetEntries()-2));
yeartype_os = dynamic_cast<TObjString*>(osArr->At(osArr->GetEntries()-1));
}
mcdata = mcdata_os->GetString();
TString yeartype = yeartype_os->GetString();
command += mcdata;
command += '/';
command += yeartype;
command += ".list.gz cvmfs ";
command += TString::Itoa(fRun,10);
command += ' ';
command += TString::Itoa(fRun,10);
command += " -y > ";
TString runValidFile(gSystem->WorkingDirectory());
runValidFile += '/';
runValidFile += mcdata;
runValidFile += '_';
runValidFile += yeartype;
runValidFile += '_';
runValidFile += TString::Itoa(fRun,10);
command += runValidFile;
AliDebug(3, Form("Running command: \"%s\"",command.Data()));
Int_t result = gSystem->Exec(command.Data());
if(result != 0) {
AliError(Form("Was not able to execute \"%s\"", command.Data()));
}
std::ifstream file (runValidFile.Data());
if (!file.is_open()) {
AliFatal(Form("Error opening file \"%s\"!", runValidFile.Data()));
}
TString filepath;
while (filepath.ReadLine(file)) {
if(! filepath.EndsWith(".root")) {
continue;
}
TObjArray *tokens = filepath.Tokenize('/');
if (tokens->GetEntries() < 5) {
AliError(Form("\"%s\" is not a valid cvmfs path for an OCDB object", filepath.Data()));
continue;
}
TObjString *baseNameOstr = (TObjString*) tokens->At(tokens->GetEntries()-1);
TString baseName(baseNameOstr->String());
TObjString *l0oStr = (TObjString*) tokens->At(tokens->GetEntries()-4);
TObjString *l1oStr = (TObjString*) tokens->At(tokens->GetEntries()-3);
TObjString *l2oStr = (TObjString*) tokens->At(tokens->GetEntries()-2);
TString l0(l0oStr->String());
TString l1(l1oStr->String());
TString l2(l2oStr->String());
TString threeLevels = l0 + '/' + l1 + '/' + l2;
AliCDBPath validPath(threeLevels);
AliCDBRunRange aRunRange;
Int_t aVersion, aSubVersion;
if ( !FilenameToId(baseName, aRunRange, aVersion, aSubVersion) )
AliError( Form("Could not create a valid CDB id from path: \"%s\"", filepath.Data()) );
AliCDBRunRange runrg(fRun,fRun);
if (!aRunRange.Comprises(runrg)) continue;
AliCDBId *validId = new AliCDBId(validPath,aRunRange,aVersion,aSubVersion);
fValidFileIds.AddLast(validId);
}
file.close();
gSystem->Exec( Form( "rm %s", runValidFile.Data() ) );
return;
}
ClassImp(AliCDBLocalFactory)
Bool_t AliCDBLocalFactory::Validate(const char* dbString) {
TRegexp dbPatternLocal("^local://.+$");
return (TString(dbString).Contains(dbPatternLocal) || TString(dbString).BeginsWith("snapshot://folder="));
}
AliCDBParam* AliCDBLocalFactory::CreateParameter(const char* dbString) {
if (!Validate(dbString)) {
return NULL;
}
TString checkSS(dbString);
if(checkSS.BeginsWith("snapshot://"))
{
TString snapshotPath("OCDB");
snapshotPath.Prepend(TString(gSystem->WorkingDirectory()) + '/');
checkSS.Remove(0,checkSS.First(':')+3);
return new AliCDBLocalParam(snapshotPath,checkSS);
}
TString pathname(dbString + sizeof("local://") - 1);
if(gSystem->ExpandPathName(pathname))
return NULL;
if (pathname[0] != '/') {
pathname.Prepend(TString(gSystem->WorkingDirectory()) + '/');
}
return new AliCDBLocalParam(pathname);
}
AliCDBStorage* AliCDBLocalFactory::Create(const AliCDBParam* param) {
if (AliCDBLocalParam::Class() == param->IsA()) {
const AliCDBLocalParam* localParam =
(const AliCDBLocalParam*) param;
return new AliCDBLocal(localParam->GetPath());
}
return NULL;
}
void AliCDBLocal::SetRetry(Int_t , Int_t ) {
AliInfo("This function sets the exponential retry for putting entries in the OCDB - to be used ONLY for AliCDBGrid --> returning without doing anything");
return;
}
ClassImp(AliCDBLocalParam)
AliCDBLocalParam::AliCDBLocalParam():
AliCDBParam(),
fDBPath()
{
}
AliCDBLocalParam::AliCDBLocalParam(const char* dbPath):
AliCDBParam(),
fDBPath(dbPath)
{
SetType("local");
SetURI(TString("local://") + dbPath);
}
AliCDBLocalParam::AliCDBLocalParam(const char* dbPath, const char* uri):
AliCDBParam(),
fDBPath(dbPath)
{
SetType("local");
SetURI(TString("alien://") + uri);
}
AliCDBLocalParam::~AliCDBLocalParam() {
}
AliCDBParam* AliCDBLocalParam::CloneParam() const {
return new AliCDBLocalParam(fDBPath);
}
ULong_t AliCDBLocalParam::Hash() const {
return fDBPath.Hash();
}
Bool_t AliCDBLocalParam::IsEqual(const TObject* obj) const {
if (this == obj) {
return kTRUE;
}
if (AliCDBLocalParam::Class() != obj->IsA()) {
return kFALSE;
}
AliCDBLocalParam* other = (AliCDBLocalParam*) obj;
return fDBPath == other->fDBPath;
}