1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15 //-------------------------------------------------------------------------
16 // Implementation of AliCDBManager and AliCDBParam classe
17 // Author: Alberto Colla
18 // e-mail: Alberto.Colla@cern.ch
19 //-------------------------------------------------------------------------
24 #include "AliCDBManager.h"
25 #include "AliCDBStorage.h"
27 #include "AliCDBDump.h"
28 #include "AliCDBLocal.h"
29 #include "AliCDBGrid.h"
30 #include "AliCDBEntry.h"
31 #include "AliCDBHandler.h"
33 #include <TObjString.h>
34 #include <TSAXParser.h>
45 ClassImp(AliCDBManager)
47 //TODO OCDB and Reference folder should not be fully hardcoded but built from run number (or year/LHC period)
48 TString AliCDBManager::fgkCondUri("alien://folder=/alice/cern.ch/user/a/aliprod/testCDB/CDB?user=aliprod");
49 TString AliCDBManager::fgkRefUri("alien://folder=/alice/cern.ch/user/a/aliprod/testCDB/Reference?user=aliprod");
50 TString AliCDBManager::fgkMCIdealStorage("alien://folder=/alice/simulation/2008/v4-15-Release/Ideal");
51 TString AliCDBManager::fgkMCFullStorage("alien://folder=/alice/simulation/2008/v4-15-Release/Full");
52 TString AliCDBManager::fgkMCResidualStorage("alien://folder=/alice/simulation/2008/v4-15-Release/Residual");
53 TString AliCDBManager::fgkOCDBFolderXMLfile("alien:///alice/data/OCDBFoldervsRunRange.xml");
54 AliCDBManager* AliCDBManager::fgInstance = 0x0;
56 //_____________________________________________________________________________
57 AliCDBManager* AliCDBManager::Instance(TMap *entryCache, Int_t run) {
58 // returns AliCDBManager instance (singleton)
61 fgInstance = new AliCDBManager();
65 fgInstance->InitFromCache(entryCache,run);
71 //_____________________________________________________________________________
72 void AliCDBManager::Init() {
73 // factory registering
75 RegisterFactory(new AliCDBDumpFactory());
76 RegisterFactory(new AliCDBLocalFactory());
77 // AliCDBGridFactory is registered only if AliEn libraries are enabled in Root
78 if(!gSystem->Exec("root-config --has-alien 2>/dev/null |grep yes 2>&1 > /dev/null")){ // returns 0 if yes
79 AliInfo("AliEn classes enabled in Root. AliCDBGrid factory registered.");
80 RegisterFactory(new AliCDBGridFactory());
81 fCondParam = CreateParameter(fgkCondUri);
82 fRefParam = CreateParameter(fgkRefUri);
88 //_____________________________________________________________________________
89 void AliCDBManager::InitFromCache(TMap *entryCache, Int_t run) {
90 // initialize manager from existing cache
91 // used on the slaves in case of parallel reconstruction
94 TIter iter(entryCache->GetTable());
97 while((pair = dynamic_cast<TPair*> (iter.Next()))){
98 fEntryCache.Add(pair->Key(),pair->Value());
100 // fEntry is the new owner of the cache
101 fEntryCache.SetOwnerKeyValue(kTRUE,kTRUE);
102 entryCache->SetOwnerKeyValue(kFALSE,kFALSE);
103 AliInfo(Form("%d cache entries have been loaded",fEntryCache.GetEntries()));
106 //_____________________________________________________________________________
107 void AliCDBManager::DumpToSnapshotFile(const char* snapshotFileName, Bool_t singleKeys){
109 // dump the entries map and the ids list to
113 TFile *f = TFile::Open(snapshotFileName,"RECREATE");
114 if (!f || f->IsZombie()){
115 AliError(Form("Cannot open file %s",snapshotFileName));
119 AliInfo(Form("Dumping entriesMap (entries'cache) with %d entries!\n", fEntryCache.GetEntries()));
120 AliInfo(Form("Dumping entriesList with %d entries!\n", fIds->GetEntries()));
125 f->WriteObject(&fEntryCache,"CDBentriesMap");
126 f->WriteObject(fIds,"CDBidsList");
128 // We write the entries one by one named by their calibration path
130 fEntryCache.Write("CDBentriesMap");
131 fIds->Write("CDBidsList");
133 TIter iter(fEntryCache.GetTable());
135 while((pair = dynamic_cast<TPair*> (iter.Next()))){
136 TObjString *os = dynamic_cast<TObjString*>(pair->Key());
138 TString path = os->GetString();
139 AliCDBEntry *entry = dynamic_cast<AliCDBEntry*>(pair->Value());
140 if (!entry) continue;
141 path.ReplaceAll("/","*");
142 entry->Write(path.Data());
151 //_____________________________________________________________________________
152 Bool_t AliCDBManager::InitFromSnapshot(const char* snapshotFileName, Bool_t overwrite){
153 // initialize manager from a CDB snapshot, that is add the entries
154 // to the entries map and the ids to the ids list taking them from
155 // the map and the list found in the input file
157 // if the manager is locked it cannot initialize from a snapshot
159 AliError("Being locked I cannot initialize from the snapshot!");
164 TString snapshotFile(snapshotFileName);
165 if(snapshotFile.BeginsWith("alien://")){
167 TGrid::Connect("alien://","");
169 AliError("Connection to alien failed!");
175 TFile *f = TFile::Open(snapshotFileName);
176 if (!f || f->IsZombie()){
177 AliError(Form("Cannot open file %s",snapshotFileName));
181 // retrieve entries' map from snapshot file
182 TMap *entriesMap = 0;
183 TIter next(f->GetListOfKeys());
185 while ((key = (TKey*)next())) {
186 if (strcmp(key->GetClassName(),"TMap") != 0) continue;
187 entriesMap = (TMap*)key->ReadObj();
190 if (!entriesMap || entriesMap->GetEntries()==0){
191 AliError("Cannot get valid map of CDB entries from snapshot file");
195 // retrieve ids' list from snapshot file
197 TIter nextKey(f->GetListOfKeys());
199 while ((keyN = (TKey*)nextKey())) {
200 if (strcmp(keyN->GetClassName(),"TList") != 0) continue;
201 idsList = (TList*)keyN->ReadObj();
204 if (!idsList || idsList->GetEntries()==0){
205 AliError("Cannot get valid list of CDB entries from snapshot file");
209 // Add each (entry,id) from the snapshot to the memory: entry to the cache, id to the list of ids.
210 // If "overwrite" is false: add the entry to the cache and its id to the list of ids
211 // only if neither of them is already there.
212 // If "overwrite" is true: write the snapshot entry,id in any case. If something
213 // was already there for that calibration type, remove it and issue a warning
214 TIter iterObj(entriesMap->GetTable());
217 while((pair = dynamic_cast<TPair*> (iterObj.Next()))){
218 TObjString* os = (TObjString*) pair->Key();
219 TString path = os->GetString();
220 TIter iterId(idsList);
222 AliCDBId* correspondingId=0;
223 while((id = dynamic_cast<AliCDBId*> (iterId.Next()))){
224 TString idpath(id->GetPath());
230 if(!correspondingId){
231 AliError(Form("id for \"%s\" not found in the snapshot (while entry was). This entry is skipped!",path.Data()));
234 Bool_t cached = fEntryCache.Contains(path.Data());
235 Bool_t registeredId = kFALSE;
238 while((idT = dynamic_cast<AliCDBId*> (iter.Next()))){
239 if(idT->GetPath()==path){
240 registeredId = kTRUE;
246 if(cached || registeredId){
247 AliWarning(Form("An entry was already cached for \"%s\". Removing it before caching from snapshot",path.Data()));
248 UnloadFromCache(path.Data());
250 fEntryCache.Add(pair->Key(),pair->Value());
254 if(cached || registeredId){
255 AliWarning(Form("An entry was already cached for \"%s\". Not adding this object from snapshot",path.Data()));
257 fEntryCache.Add(pair->Key(),pair->Value());
264 // fEntry is the new owner of the cache
265 fEntryCache.SetOwnerKeyValue(kTRUE,kTRUE);
266 entriesMap->SetOwnerKeyValue(kFALSE,kFALSE);
267 fIds->SetOwner(kTRUE);
268 idsList->SetOwner(kFALSE);
269 AliInfo(Form("%d new (entry,id) cached. Total number %d",nAdded,fEntryCache.GetEntries()));
277 //_____________________________________________________________________________
278 void AliCDBManager::Destroy() {
279 // delete ALCDBManager instance and active storages
282 //fgInstance->Delete();
288 //_____________________________________________________________________________
289 AliCDBManager::AliCDBManager():
298 fDefaultStorage(NULL),
305 fSnapshotMode(kFALSE),
309 fStartRunLHCPeriod(-1),
310 fEndRunLHCPeriod(-1),
314 // default constuctor
315 fFactories.SetOwner(1);
316 fActiveStorages.SetOwner(1);
317 fSpecificStorages.SetOwner(1);
318 fEntryCache.SetName("CDBEntryCache");
319 fEntryCache.SetOwnerKeyValue(kTRUE,kTRUE);
321 fStorageMap = new TMap();
322 fStorageMap->SetOwner(1);
327 //_____________________________________________________________________________
328 AliCDBManager::~AliCDBManager() {
331 DestroyActiveStorages();
334 fDefaultStorage = 0x0;
335 delete fStorageMap; fStorageMap = 0;
336 delete fIds; fIds = 0;
339 delete fShortLived; fShortLived = 0x0;
340 //fSnapshotCache = 0;
341 //fSnapshotIdsList = 0;
343 fSnapshotFile->Close();
348 //_____________________________________________________________________________
349 void AliCDBManager::PutActiveStorage(AliCDBParam* param, AliCDBStorage* storage){
350 // put a storage object into the list of active storages
352 fActiveStorages.Add(param, storage);
353 AliDebug(1, Form("Active storages: %d", fActiveStorages.GetEntries()));
356 //_____________________________________________________________________________
357 void AliCDBManager::RegisterFactory(AliCDBStorageFactory* factory) {
358 // add a storage factory to the list of registerd factories
360 if (!fFactories.Contains(factory)) {
361 fFactories.Add(factory);
365 //_____________________________________________________________________________
366 Bool_t AliCDBManager::HasStorage(const char* dbString) const {
367 // check if dbString is a URI valid for one of the registered factories
369 TIter iter(&fFactories);
371 AliCDBStorageFactory* factory=0;
372 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
374 if (factory->Validate(dbString)) {
382 //_____________________________________________________________________________
383 AliCDBParam* AliCDBManager::CreateParameter(const char* dbString) const {
384 // create AliCDBParam object from URI string
386 TString uriString(dbString);
388 if (! fCvmfsOcdb.IsNull()) {
389 AlienToCvmfsUri(uriString);
392 TIter iter(&fFactories);
394 AliCDBStorageFactory* factory=0;
395 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
396 //AliCDBParam* param = factory->CreateParameter(dbString);
397 AliCDBParam* param = factory->CreateParameter(uriString);
398 if(param) return param;
404 //_____________________________________________________________________________
405 void AliCDBManager::AlienToCvmfsUri(TString& uriString) const {
406 // convert alien storage uri to local:///cvmfs storage uri (called when OCDB_PATH is set)
408 if (! uriString.BeginsWith("alien://") && !fCvmfsOcdb.IsNull())
409 AliFatal("Cannot set local://cvmfs storage for a non alien uri");
411 TObjArray *arr = uriString.Tokenize('?');
414 TString entryKey = "";
415 TString entryValue = "";
416 TString newUriString = "";
417 while((str = (TObjString*) iter.Next())){
418 TString entry(str->String());
419 Int_t indeq = entry.Index('=');
420 entryKey = entry(0, indeq+1);
421 entryValue = entry(indeq+1, entry.Length()-indeq);
423 if ( entryKey.Contains("folder", TString::kIgnoreCase) )
426 TRegexp re_RawFolder("^/alice/data/20[0-9]+/OCDB");
427 TRegexp re_MCFolder("^/alice/simulation/2008/v4-15-Release");
428 TString rawFolder = entryValue(re_RawFolder);
429 TString mcFolder = entryValue(re_MCFolder);
430 if ( !rawFolder.IsNull() ){
431 entryValue.Replace(0, 6, "/cvmfs/alice.cern.ch/calibration");
432 entryValue.Replace(entryValue.Length()-4, entryValue.Length(), "");
433 } else if ( !mcFolder.IsNull() ){
434 entryValue.Replace(0,36,"/cvmfs/alice.cern.ch/calibration/MC");
436 AliFatal(Form("Environment variable for cvmfs OCDB folder set for an invalid OCDB storage:\n %s", entryValue.Data()));
439 newUriString += entryKey;
441 newUriString += entryValue;
444 newUriString.Prepend("local://");
445 newUriString.Remove(TString::kTrailing, '?');
446 uriString = newUriString;
449 //_____________________________________________________________________________
450 AliCDBStorage* AliCDBManager::GetStorage(const char* dbString) {
451 // get storage object from URI string
453 // Check environment variable OCDB_PATH. It is set in case the user (job) expects
454 // to find in the local /cvmfs the required OCDB tag. The OCDB_PATH variable
455 // contains the path to the directory in /cvmfs/ which is an AliRoot tag based snapshot
456 // of the AliEn file catalogue. The directory has to contain:
457 // 1) catalogue/20??.list.gz gzipped text files listing the OCDB files (seen by that AliRoot tag)
458 // 2) bin/getOCDBperRun.sh (shell+awk) script extracting from 1) the list
459 // of valid files for the given run.
461 AliCDBParam* param = CreateParameter(dbString);
463 AliError(Form("Failed to activate requested storage! Check URI: %s", dbString));
467 AliCDBStorage* aStorage = GetStorage(param);
473 //_____________________________________________________________________________
474 AliCDBStorage* AliCDBManager::GetStorage(const AliCDBParam* param) {
475 // get storage object from AliCDBParam object
477 // if the list of active storages already contains
478 // the requested storage, return it
479 AliCDBStorage* aStorage = GetActiveStorage(param);
484 // if lock is ON, cannot activate more storages!
486 if (fDefaultStorage) {
487 AliFatal("Lock is ON, and default storage is already set: "
488 "cannot reset it or activate more storages!");
492 // loop on the list of registered factories
493 TIter iter(&fFactories);
494 AliCDBStorageFactory* factory=0;
495 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
497 // each factory tries to create its storage from the parameter
498 aStorage = factory->Create(param);
500 PutActiveStorage(param->CloneParam(), aStorage);
501 aStorage->SetURI(param->GetURI());
503 if( aStorage->GetType() == "alien" || aStorage->GetType() == "local" )
504 aStorage->QueryCDB(fRun);
507 // "Skipping query for valid files, it is used only in grid...");
514 AliError(Form("Failed to activate requested storage! Check URI: %s", param->GetURI().Data()));
519 //_____________________________________________________________________________
520 AliCDBStorage* AliCDBManager::GetActiveStorage(const AliCDBParam* param) {
521 // get a storage object from the list of active storages
523 return dynamic_cast<AliCDBStorage*> (fActiveStorages.GetValue(param));
526 //_____________________________________________________________________________
527 TList* AliCDBManager::GetActiveStorages() {
528 // return list of active storages
529 // user has responsibility to delete returned object
531 TList* result = new TList();
533 TIter iter(fActiveStorages.GetTable());
535 while ((aPair = (TPair*) iter.Next())) {
536 result->Add(aPair->Value());
542 //_____________________________________________________________________________
543 void AliCDBManager::SetDrain(const char* dbString) {
544 // set drain storage from URI string
546 fDrainStorage = GetStorage(dbString);
549 //_____________________________________________________________________________
550 void AliCDBManager::SetDrain(const AliCDBParam* param) {
551 // set drain storage from AliCDBParam
553 fDrainStorage = GetStorage(param);
556 //_____________________________________________________________________________
557 void AliCDBManager::SetDrain(AliCDBStorage* storage) {
558 // set drain storage from another active storage
560 fDrainStorage = storage;
563 //_____________________________________________________________________________
564 Bool_t AliCDBManager::Drain(AliCDBEntry *entry) {
565 // drain retrieved object to drain storage
567 AliDebug(2, "Draining into drain storage...");
568 return fDrainStorage->Put(entry);
571 //____________________________________________________________________________
572 void AliCDBManager::SetDefaultStorage(const char* storageUri) {
573 // sets default storage from URI string
575 // if in the cvmfs case (triggered by environment variable) check for path validity
576 // and modify Uri if it is "raw://"
577 TString cvmfsOcdb(gSystem->Getenv("OCDB_PATH"));
578 if (! cvmfsOcdb.IsNull()){
579 fCvmfsOcdb = cvmfsOcdb;
583 // checking whether we are in the raw case
584 TString uriTemp(storageUri);
585 if (uriTemp == "raw://") {
586 fRaw = kTRUE; // read then by SetRun to check if the method has to be called again with expanded uri
587 AliInfo("Setting the run-number will set the corresponding OCDB for raw data reconstruction.");
591 AliCDBStorage* bckStorage = fDefaultStorage;
593 fDefaultStorage = GetStorage(storageUri);
595 if(!fDefaultStorage) return;
597 if(bckStorage && (fDefaultStorage != bckStorage)){
598 AliWarning("Existing default storage replaced: clearing cache!");
602 if (fStorageMap->Contains("default")) {
603 delete fStorageMap->Remove(((TPair*)fStorageMap->FindObject("default"))->Key());
605 fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
608 //_____________________________________________________________________________
609 void AliCDBManager::SetDefaultStorage(const AliCDBParam* param) {
610 // set default storage from AliCDBParam object
612 AliCDBStorage* bckStorage = fDefaultStorage;
614 fDefaultStorage = GetStorage(param);
616 if(!fDefaultStorage) return;
618 if(bckStorage && (fDefaultStorage != bckStorage)){
619 AliWarning("Existing default storage replaced: clearing cache!");
623 if (fStorageMap->Contains("default")) {
624 delete fStorageMap->Remove(((TPair*)fStorageMap->FindObject("default"))->Key());
626 fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
629 //_____________________________________________________________________________
630 void AliCDBManager::SetDefaultStorage(AliCDBStorage* storage) {
631 // set default storage from another active storage
633 // if lock is ON, cannot activate more storages!
635 if (fDefaultStorage) {
636 AliFatal("Lock is ON, and default storage is already set: "
637 "cannot reset it or activate more storages!");
642 UnsetDefaultStorage();
646 AliCDBStorage* bckStorage = fDefaultStorage;
648 fDefaultStorage = storage;
650 if(bckStorage && (fDefaultStorage != bckStorage)){
651 AliWarning("Existing default storage replaced: clearing cache!");
655 if (fStorageMap->Contains("default")) {
656 delete fStorageMap->Remove(((TPair*)fStorageMap->FindObject("default"))->Key());
658 fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
661 //_____________________________________________________________________________
662 void AliCDBManager::SetDefaultStorage(const char* mcString, const char* simType) {
663 // sets default storage for MC data
664 // mcString MUST be "MC",
665 // simType can be "Ideal","Residual","Full"
667 TString strmcString(mcString);
668 TString strsimType(simType);
670 if (strmcString != "MC"){
671 AliFatal("Method requires first string to be MC!");
674 if (strsimType == "Ideal"){
675 dbString = fgkMCIdealStorage;
677 else if (strsimType == "Full"){
678 dbString = fgkMCFullStorage;
680 else if (strsimType == "Residual"){
681 dbString = fgkMCResidualStorage;
684 AliFatal("Error in setting the storage for MC data, second argument MUST be either \"Ideal\" or \"Full\" or \"Residual\".");
687 SetDefaultStorage(dbString.Data());
688 fStartRunLHCPeriod=0;
689 fEndRunLHCPeriod=AliCDBRunRange::Infinity();
690 if(!fDefaultStorage) AliFatal(Form("%s storage not there! Please check!",dbString.Data()));
694 //_____________________________________________________________________________
695 void AliCDBManager::ValidateCvmfsCase() const {
696 if (! fCvmfsOcdb.BeginsWith("/cvmfs")) //!!!! to be commented out for testing
697 AliFatal(Form("OCDB_PATH set to an invalid path: %s", fCvmfsOcdb.Data()));
699 TString cvmfsUri(fCvmfsOcdb);
700 gSystem->ExpandPathName(cvmfsUri);
701 if (gSystem->AccessPathName(cvmfsUri))
702 AliFatal(Form("OCDB_PATH set to an invalid path: %s", cvmfsUri.Data()));
704 // check that we find the two scripts we need
706 AliDebug(3, "OCDB_PATH envvar is set. Changing OCDB storage from alien:// to local:///cvmfs type.");
707 cvmfsUri = cvmfsUri.Strip(TString::kTrailing, '/');
708 cvmfsUri.Append("/bin/getOCDBFilesPerRun.sh");
709 if (gSystem->AccessPathName(cvmfsUri))
710 AliFatal(Form("Cannot find valid script: %s", cvmfsUri.Data()));
713 //_____________________________________________________________________________
714 void AliCDBManager::SetDefaultStorageFromRun(Int_t run) {
715 // set default storage from the run number - to be used only with raw data
717 // if lock is ON, cannot activate more storages!
719 if (fDefaultStorage) {
720 AliFatal("Lock is ON, and default storage is already set: "
721 "cannot activate default storage from run number");
725 // fRaw and cvmfs case
726 if (! fCvmfsOcdb.IsNull()) {
727 // we don't want to connect to AliEn just to set the uri from the runnumber
728 // for that we use the script getUriFromYear.sh in the cvmfs AliRoot package
729 // check that we find the two scripts we need
730 TString getYearScript(fCvmfsOcdb);
731 getYearScript = getYearScript.Strip(TString::kTrailing, '/');
732 getYearScript.Append("/bin/getUriFromYear.sh");
733 if (gSystem->AccessPathName(getYearScript))
734 AliFatal(Form("Cannot find valid script: %s", getYearScript.Data()));
735 TString inoutFile(gSystem->WorkingDirectory());
736 inoutFile += "/uri_range_";
737 inoutFile += TString::Itoa(fRun,10);
738 TString command(getYearScript);
740 command += TString::Itoa(fRun,10);
741 command += Form(" > %s", inoutFile.Data());
742 AliDebug(3, Form("Running command: \"%s\"",command.Data()));
743 Int_t result = gSystem->Exec(command.Data());
745 AliFatal(Form("Was not able to execute \"%s\"", command.Data()));
748 // now read the file with the uri and first and last run
749 ifstream *file = new ifstream(inoutFile.Data());
751 AliFatal(Form("Error opening file \"%s\"!", inoutFile.Data()));
756 TObjArray* oStringsArray = 0;
757 while (lhcPeriod.ReadLine(*file)){
758 oStringsArray = lhcPeriod.Tokenize(' ');
760 TObjString *oStrUri = dynamic_cast<TObjString*> (oStringsArray->At(0));
761 TObjString *oStrFirst = dynamic_cast<TObjString*> (oStringsArray->At(1));
762 TString firstRun = oStrFirst->GetString();
763 TObjString *oStrLast = dynamic_cast<TObjString*> (oStringsArray->At(2));
764 TString lastRun = oStrLast->GetString();
766 fLHCPeriod = oStrUri->GetString();
767 fStartRunLHCPeriod = firstRun.Atoi();
768 fEndRunLHCPeriod = lastRun.Atoi();
773 } else { // if not cvmfs case, "plain" AliEn case
774 // retrieve XML file from alien
776 TGrid::Connect("alien://","");
778 AliError("Connection to alien failed!");
783 TString rndname = "/tmp/";
784 rndname += "OCDBFolderXML.";
785 rndname += uuid.AsString();
787 AliDebug(2, Form("file to be copied = %s", fgkOCDBFolderXMLfile.Data()));
788 if (!TFile::Cp(fgkOCDBFolderXMLfile.Data(), rndname.Data())) {
789 AliFatal(Form("Cannot make a local copy of OCDBFolder xml file in %s",rndname.Data()));
791 AliCDBHandler* saxcdb = new AliCDBHandler();
793 TSAXParser *saxParser = new TSAXParser();
794 saxParser->ConnectToHandler("AliCDBHandler", saxcdb);
795 saxParser->ParseFile(rndname.Data());
796 AliInfo(Form(" LHC folder = %s", saxcdb->GetOCDBFolder().Data()));
797 AliInfo(Form(" LHC period start run = %d", saxcdb->GetStartRunRange()));
798 AliInfo(Form(" LHC period end run = %d", saxcdb->GetEndRunRange()));
799 fLHCPeriod = saxcdb->GetOCDBFolder();
800 fStartRunLHCPeriod = saxcdb->GetStartRunRange();
801 fEndRunLHCPeriod = saxcdb->GetEndRunRange();
804 SetDefaultStorage(fLHCPeriod.Data());
805 if(!fDefaultStorage) AliFatal(Form("%s storage not there! Please check!",fLHCPeriod.Data()));
809 //_____________________________________________________________________________
810 void AliCDBManager::UnsetDefaultStorage() {
811 // Unset default storage
813 // if lock is ON, action is forbidden!
815 if (fDefaultStorage) {
816 AliFatal("Lock is ON: cannot unset default storage!");
820 if (fDefaultStorage) {
821 AliWarning("Clearing cache!");
825 fRun = fStartRunLHCPeriod = fEndRunLHCPeriod = -1;
828 fDefaultStorage = 0x0;
831 //_____________________________________________________________________________
832 void AliCDBManager::SetSpecificStorage(const char* calibType, const char* dbString) {
833 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
835 AliCDBParam *aPar = CreateParameter(dbString);
837 SetSpecificStorage(calibType, aPar);
841 //_____________________________________________________________________________
842 void AliCDBManager::SetSpecificStorage(const char* calibType, const AliCDBParam* param) {
843 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
844 // Default storage should be defined prior to any specific storages, e.g.:
845 // AliCDBManager::instance()->SetDefaultStorage("alien://");
846 // AliCDBManager::instance()->SetSpecificStorage("TPC/*","local://DB_TPC");
847 // AliCDBManager::instance()->SetSpecificStorage("*/Align/*","local://DB_TPCAlign");
848 // calibType must be a valid CDB path! (3 level folder structure)
851 if(!fDefaultStorage && !fRaw) {
852 AliError("Please activate a default storage first!");
857 AliCDBPath aPath(calibType);
858 if(!aPath.IsValid()){
859 AliError(Form("Not a valid path: %s", calibType));
863 TObjString *objCalibType = new TObjString(aPath.GetPath());
864 if(fSpecificStorages.Contains(objCalibType)){
865 AliWarning(Form("Storage \"%s\" already activated! It will be replaced by the new one",
867 AliCDBParam *checkPar = dynamic_cast<AliCDBParam*> (fSpecificStorages.GetValue(calibType));
868 if(checkPar) delete checkPar;
869 delete fSpecificStorages.Remove(objCalibType);
871 AliCDBStorage *aStorage = GetStorage(param);
872 if(!aStorage) return;
874 fSpecificStorages.Add(objCalibType, param->CloneParam());
876 if(fStorageMap->Contains(objCalibType)){
877 delete fStorageMap->Remove(objCalibType);
879 fStorageMap->Add(objCalibType->Clone(), new TObjString(param->GetURI()));
883 //_____________________________________________________________________________
884 AliCDBStorage* AliCDBManager::GetSpecificStorage(const char* calibType) {
885 // get storage specific for detector or calibration type
887 AliCDBPath calibPath(calibType);
888 if(!calibPath.IsValid()) return NULL;
890 AliCDBParam *checkPar = (AliCDBParam*) fSpecificStorages.GetValue(calibPath.GetPath());
892 AliError(Form("%s storage not found!", calibType));
895 return GetStorage(checkPar);
900 //_____________________________________________________________________________
901 AliCDBParam* AliCDBManager::SelectSpecificStorage(const TString& path) {
902 // select storage valid for path from the list of specific storages
904 AliCDBPath aPath(path);
905 if(!aPath.IsValid()) return NULL;
907 TIter iter(&fSpecificStorages);
908 TObjString *aCalibType=0;
909 AliCDBPath tmpPath("null/null/null");
911 while((aCalibType = (TObjString*) iter.Next())){
912 AliCDBPath calibTypePath(aCalibType->GetName());
913 if(calibTypePath.Comprises(aPath)) {
914 if(calibTypePath.Comprises(tmpPath)) continue;
915 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
916 tmpPath.SetPath(calibTypePath.GetPath());
922 //_____________________________________________________________________________
923 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path, Int_t runNumber,
924 Int_t version, Int_t subVersion) {
925 // get an AliCDBEntry object from the database
928 // RunNumber is not specified. Try with fRun
930 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
936 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
939 //_____________________________________________________________________________
940 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path,
941 const AliCDBRunRange& runRange, Int_t version,
943 // get an AliCDBEntry object from the database!
945 return Get(AliCDBId(path, runRange, version, subVersion));
948 //_____________________________________________________________________________
949 AliCDBEntry* AliCDBManager::Get(const AliCDBId& query, Bool_t forceCaching) {
950 // get an AliCDBEntry object from the database
952 // check if query's path and runRange are valid
953 // query is invalid also if version is not specified and subversion is!
954 if (!query.IsValid()) {
955 AliError(Form("Invalid query: %s", query.ToString().Data()));
959 // query is not specified if path contains wildcard or run range= [-1,-1]
960 if (!query.IsSpecified()) {
961 AliError(Form("Unspecified query: %s",
962 query.ToString().Data()));
966 if(fLock && !(fRun >= query.GetFirstRun() && fRun <= query.GetLastRun()))
967 AliFatal("Lock is ON: cannot use different run number than the internal one!");
969 if(fCache && !(fRun >= query.GetFirstRun() && fRun <= query.GetLastRun()))
970 AliWarning("Run number explicitly set in query: CDB cache temporarily disabled!");
972 AliCDBEntry *entry=0;
974 // first look into map of cached objects
975 if(fCache && query.GetFirstRun() == fRun)
976 entry = (AliCDBEntry*) fEntryCache.GetValue(query.GetPath());
978 AliDebug(2, Form("Object %s retrieved from cache !!",query.GetPath().Data()));
982 // if snapshot flag is set, try getting from the snapshot
983 // but in the case a specific storage is specified for this path
984 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
986 if(fSnapshotMode && query.GetFirstRun() == fRun)
988 entry = GetEntryFromSnapshot(query.GetPath());
990 AliInfo(Form("Object \"%s\" retrieved from the snapshot.",query.GetPath().Data()));
991 if(query.GetFirstRun() == fRun) // no need to check fCache, fSnapshotMode not possible otherwise
992 CacheEntry(query.GetPath(), entry);
994 if(!fIds->Contains(&entry->GetId()))
995 fIds->Add(entry->GetId().Clone());
1002 // Entry is not in cache (and, in case we are in snapshot mode, not in the snapshot either)
1003 // => retrieve it from the storage and cache it!!
1004 if(!fDefaultStorage) {
1005 AliError("No storage set!");
1009 AliCDBStorage *aStorage=0;
1011 aStorage=GetStorage(aPar);
1012 TString str = aPar->GetURI();
1013 AliDebug(2,Form("Looking into storage: %s",str.Data()));
1015 aStorage=GetDefaultStorage();
1016 AliDebug(2,"Looking into default storage");
1019 entry = aStorage->Get(query);
1021 if(entry && fCache && (query.GetFirstRun()==fRun || forceCaching)){
1022 CacheEntry(query.GetPath(), entry);
1025 if(entry && !fIds->Contains(&entry->GetId())){
1026 fIds->Add(entry->GetId().Clone());
1034 //_____________________________________________________________________________
1035 AliCDBEntry* AliCDBManager::GetEntryFromSnapshot(const char* path) {
1036 // get the entry from the open snapshot file
1038 TString sPath(path);
1039 sPath.ReplaceAll("/","*");
1041 AliError("No snapshot file is open!");
1044 AliCDBEntry *entry = dynamic_cast<AliCDBEntry*>(fSnapshotFile->Get(sPath.Data()));
1046 AliDebug(2,Form("Cannot get a CDB entry for \"%s\" from snapshot file",path));
1053 //_____________________________________________________________________________
1054 Bool_t AliCDBManager::SetSnapshotMode(const char* snapshotFileName) {
1055 // set the manager in snapshot mode
1058 AliError("Cannot set the CDB manage in snapshot mode if the cache is not active!");
1062 //open snapshot file
1063 TString snapshotFile(snapshotFileName);
1064 if(snapshotFile.BeginsWith("alien://")){
1066 TGrid::Connect("alien://","");
1068 AliError("Connection to alien failed!");
1074 fSnapshotFile = TFile::Open(snapshotFileName);
1075 if (!fSnapshotFile || fSnapshotFile->IsZombie()){
1076 AliError(Form("Cannot open file %s",snapshotFileName));
1080 AliInfo("The CDB manager is set in snapshot mode!");
1081 fSnapshotMode = kTRUE;
1086 //_____________________________________________________________________________
1087 const char* AliCDBManager::GetURI(const char* path) {
1088 // return the URI of the storage where to look for path
1090 if(!IsDefaultStorageSet()) return 0;
1092 AliCDBParam *aPar=SelectSpecificStorage(path);
1095 return aPar->GetURI().Data();
1098 return GetDefaultStorage()->GetURI().Data();
1104 //_____________________________________________________________________________
1105 Int_t AliCDBManager::GetStartRunLHCPeriod(){
1106 // get the first run of validity
1107 // for the current period
1109 if(fStartRunLHCPeriod==-1)
1110 AliWarning("Run-range not yet set for the current LHC period.");
1111 return fStartRunLHCPeriod;
1114 //_____________________________________________________________________________
1115 Int_t AliCDBManager::GetEndRunLHCPeriod(){
1116 // get the last run of validity
1117 // for the current period
1119 if(fEndRunLHCPeriod==-1)
1120 AliWarning("Run-range not yet set for the current LHC period.");
1121 return fEndRunLHCPeriod;
1124 //_____________________________________________________________________________
1125 TString AliCDBManager::GetLHCPeriod(){
1126 // get the current LHC period string
1128 if(fLHCPeriod.IsWhitespace() || fLHCPeriod.IsNull())
1129 AliWarning("LHC period (OCDB folder) not yet set");
1133 //_____________________________________________________________________________
1134 AliCDBId* AliCDBManager::GetId(const AliCDBPath& path, Int_t runNumber,
1135 Int_t version, Int_t subVersion) {
1136 // get the AliCDBId of the valid object from the database (does not retrieve the object)
1137 // User must delete returned object!
1140 // RunNumber is not specified. Try with fRun
1142 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
1148 return GetId(AliCDBId(path, runNumber, runNumber, version, subVersion));
1151 //_____________________________________________________________________________
1152 AliCDBId* AliCDBManager::GetId(const AliCDBPath& path,
1153 const AliCDBRunRange& runRange, Int_t version,
1155 // get the AliCDBId of the valid object from the database (does not retrieve the object)
1156 // User must delete returned object!
1158 return GetId(AliCDBId(path, runRange, version, subVersion));
1161 //_____________________________________________________________________________
1162 AliCDBId* AliCDBManager::GetId(const AliCDBId& query) {
1163 // get the AliCDBId of the valid object from the database (does not retrieve the object)
1164 // User must delete returned object!
1166 if(!fDefaultStorage) {
1167 AliError("No storage set!");
1171 // check if query's path and runRange are valid
1172 // query is invalid also if version is not specified and subversion is!
1173 if (!query.IsValid()) {
1174 AliError(Form("Invalid query: %s", query.ToString().Data()));
1178 // query is not specified if path contains wildcard or run range= [-1,-1]
1179 if (!query.IsSpecified()) {
1180 AliError(Form("Unspecified query: %s",
1181 query.ToString().Data()));
1185 if(fCache && query.GetFirstRun() != fRun)
1186 AliWarning("Run number explicitly set in query: CDB cache temporarily disabled!");
1188 AliCDBEntry* entry = 0;
1190 // first look into map of cached objects
1191 if(fCache && query.GetFirstRun() == fRun)
1192 entry = (AliCDBEntry*) fEntryCache.GetValue(query.GetPath());
1195 AliDebug(2, Form("Object %s retrieved from cache !!",query.GetPath().Data()));
1196 return dynamic_cast<AliCDBId*> (entry->GetId().Clone());
1199 // Entry is not in cache -> retrieve it from CDB and cache it!!
1200 AliCDBStorage *aStorage=0;
1201 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
1204 aStorage=GetStorage(aPar);
1205 TString str = aPar->GetURI();
1206 AliDebug(2,Form("Looking into storage: %s",str.Data()));
1209 aStorage=GetDefaultStorage();
1210 AliDebug(2,"Looking into default storage");
1213 return aStorage->GetId(query);
1217 //_____________________________________________________________________________
1218 TList* AliCDBManager::GetAll(const AliCDBPath& path, Int_t runNumber,
1219 Int_t version, Int_t subVersion) {
1220 // get multiple AliCDBEntry objects from the database
1223 // RunNumber is not specified. Try with fRun
1225 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
1231 return GetAll(AliCDBId(path, runNumber, runNumber, version,
1235 //_____________________________________________________________________________
1236 TList* AliCDBManager::GetAll(const AliCDBPath& path,
1237 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
1238 // get multiple AliCDBEntry objects from the database
1240 return GetAll(AliCDBId(path, runRange, version, subVersion));
1243 //_____________________________________________________________________________
1244 TList* AliCDBManager::GetAll(const AliCDBId& query) {
1245 // get multiple AliCDBEntry objects from the database
1246 // Warning: this method works correctly only for queries of the type "Detector/*"
1247 // and not for more specific queries e.g. "Detector/Calib/*" !
1248 // Warning #2: Entries are cached, but GetAll will keep on retrieving objects from OCDB!
1249 // To get an object from cache use Get() function
1251 if(!fDefaultStorage) {
1252 AliError("No storage set!");
1256 if (!query.IsValid()) {
1257 AliError(Form("Invalid query: %s", query.ToString().Data()));
1261 if((fSpecificStorages.GetEntries()>0) && query.GetPath().BeginsWith('*')){
1262 // if specific storages are active a query with "*" is ambiguous
1263 AliError("Query too generic in this context!");
1267 if (query.IsAnyRange()) {
1268 AliError(Form("Unspecified run or runrange: %s",
1269 query.ToString().Data()));
1273 if(fLock && query.GetFirstRun() != fRun)
1274 AliFatal("Lock is ON: cannot use different run number than the internal one!");
1276 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
1278 AliCDBStorage *aStorage;
1280 aStorage=GetStorage(aPar);
1281 AliDebug(2,Form("Looking into storage: %s", aPar->GetURI().Data()));
1284 aStorage=GetDefaultStorage();
1285 AliDebug(2,Form("Looking into default storage: %s", aStorage->GetURI().Data()));
1289 if(aStorage) result = aStorage->GetAll(query);
1290 if(!result) return 0;
1292 // loop on result to check whether entries should be re-queried with specific storages
1293 if(fSpecificStorages.GetEntries()>0 && ! (fSpecificStorages.GetEntries() == 1 && aPar)) {
1294 AliInfo("Now look into all other specific storages...");
1297 AliCDBEntry* chkEntry=0;
1299 while((chkEntry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
1300 AliCDBId& chkId = chkEntry->GetId();
1301 AliDebug(2, Form("Checking id %s ", chkId.GetPath().Data()));
1302 AliCDBParam *chkPar=SelectSpecificStorage(chkId.GetPath());
1303 if (!chkPar || aPar == chkPar) continue;
1304 AliCDBStorage *chkStorage = GetStorage(chkPar);
1305 AliDebug(2, Form("Found specific storage! %s", chkPar->GetURI().Data()));
1307 AliCDBEntry *newEntry=0;
1308 chkId.SetRunRange(query.GetFirstRun(), query.GetLastRun());
1309 chkId.SetVersion(query.GetVersion());
1310 chkId.SetSubVersion(query.GetSubVersion());
1312 if(chkStorage) newEntry = chkStorage->Get(chkId);
1313 if(!newEntry) continue;
1315 // object is found in specific storage: replace entry in the result list!
1316 chkEntry->SetOwner(1);
1317 delete result->Remove(chkEntry);
1318 result->AddFirst(newEntry);
1321 Int_t nEntries = result->GetEntries();
1322 AliInfo("After look into other specific storages, result list is:");
1323 for(int i=0; i<nEntries;i++){
1324 AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
1325 AliInfo(Form("%s",entry->GetId().ToString().Data()));
1331 AliCDBEntry* entry=0;
1332 while((entry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
1334 if(!fIds->Contains(&entry->GetId())){
1335 fIds->Add(entry->GetId().Clone());
1337 if(fCache && (query.GetFirstRun() == fRun)){
1338 CacheEntry(entry->GetId().GetPath(), entry);
1346 //_____________________________________________________________________________
1347 Bool_t AliCDBManager::Put(TObject* object, const AliCDBId& id, AliCDBMetaData* metaData, const char* mirrors, DataType type){
1348 // store an AliCDBEntry object into the database
1351 AliError("Null Entry! No storage will be done!");
1355 AliCDBEntry anEntry(object, id, metaData);
1356 return Put(&anEntry, mirrors, type);
1361 //_____________________________________________________________________________
1362 Bool_t AliCDBManager::Put(AliCDBEntry* entry, const char* mirrors, DataType type){
1363 // store an AliCDBEntry object into the database
1365 if(type == kPrivate && !fDefaultStorage) {
1366 AliError("No storage set!");
1371 AliError("No entry!");
1375 if (entry->GetObject()==0x0){
1376 AliError("No valid object in CDB entry!");
1380 if (!entry->GetId().IsValid()) {
1381 AliError(Form("Invalid entry ID: %s",
1382 entry->GetId().ToString().Data()));
1386 if (!entry->GetId().IsSpecified()) {
1387 AliError(Form("Unspecified entry ID: %s",
1388 entry->GetId().ToString().Data()));
1392 AliCDBId id = entry->GetId();
1393 AliCDBParam *aPar = SelectSpecificStorage(id.GetPath());
1395 AliCDBStorage *aStorage=0;
1398 aStorage=GetStorage(aPar);
1402 aStorage = GetStorage(fCondParam);
1405 aStorage = GetStorage(fRefParam);
1408 aStorage = GetDefaultStorage();
1413 AliDebug(2,Form("Storing object into storage: %s", aStorage->GetURI().Data()));
1415 TString strMirrors(mirrors);
1416 Bool_t result = kFALSE;
1417 if(!strMirrors.IsNull() && !strMirrors.IsWhitespace())
1418 result = aStorage->Put(entry, mirrors, type);
1420 result = aStorage->Put(entry, "", type);
1422 if(fRun >= 0) QueryCDB();
1429 //_____________________________________________________________________________
1430 void AliCDBManager::SetMirrorSEs(const char* mirrors) {
1431 // set mirror Storage Elements for the default storage, if it is of type "alien"
1432 if(fDefaultStorage->GetType() != "alien"){
1433 AliInfo("The default storage is not of type \"alien\". Settings for Storage Elements are not taken into account!");
1436 fDefaultStorage->SetMirrorSEs(mirrors);
1439 //_____________________________________________________________________________
1440 const char* AliCDBManager::GetMirrorSEs() const {
1441 // get mirror Storage Elements for the default storage, if it is of type "alien"
1442 if(fDefaultStorage->GetType() != "alien"){
1443 AliInfo("The default storage is not of type \"alien\". Settings for Storage Elements are not taken into account!");
1446 return fDefaultStorage->GetMirrorSEs();
1449 //_____________________________________________________________________________
1450 void AliCDBManager::CacheEntry(const char* path, AliCDBEntry* entry) {
1451 // cache AliCDBEntry. Cache is valid until run number is changed.
1453 AliCDBEntry *chkEntry = dynamic_cast<AliCDBEntry*> (fEntryCache.GetValue(path));
1456 AliDebug(2, Form("Object %s already in cache !!", path));
1459 AliDebug(2,Form("Caching entry %s", path));
1462 fEntryCache.Add(new TObjString(path), entry);
1463 AliDebug(2,Form("Cache entries: %d", fEntryCache.GetEntries()));
1467 //_____________________________________________________________________________
1468 void AliCDBManager::Print(Option_t* /*option*/) const {
1469 // Print list of active storages and their URIs
1471 TString output=Form("Run number = %d; ",fRun);
1472 output += "Cache is ";
1473 if(!fCache) output += "NOT ";
1474 output += Form("ACTIVE; Number of active storages: %d\n",fActiveStorages.GetEntries());
1476 if(fDefaultStorage) {
1477 output += Form("\t*** Default Storage URI: \"%s\"\n",fDefaultStorage->GetURI().Data());
1478 // AliInfo(output.Data());
1480 if(fSpecificStorages.GetEntries()>0) {
1481 TIter iter(fSpecificStorages.GetTable());
1484 while((aPair = (TPair*) iter.Next())){
1485 output += Form("\t*** Specific storage %d: Path \"%s\" -> URI \"%s\"\n",
1486 i++, ((TObjString*) aPair->Key())->GetName(),
1487 ((AliCDBParam*) aPair->Value())->GetURI().Data());
1491 output += Form("*** Drain Storage URI: %s\n",fDrainStorage->GetURI().Data());
1493 AliInfo(output.Data());
1496 //_____________________________________________________________________________
1497 void AliCDBManager::SetRun(Int_t run) {
1498 // Sets current run number.
1499 // When the run number changes the caching is cleared.
1504 if(fLock && fRun >= 0) {
1505 AliFatal("Lock is ON, cannot reset run number!");
1511 // here the LHCPeriod xml file is parsed; the string containing the correct period is returned; the default storage is set
1512 if (fStartRunLHCPeriod <= run && fEndRunLHCPeriod >= run){
1513 AliInfo("LHCPeriod alien folder for current run already in memory");
1515 SetDefaultStorageFromRun(run);
1516 if(fEntryCache.GetEntries()!=0) ClearCache();
1524 //_____________________________________________________________________________
1525 void AliCDBManager::ClearCache(){
1526 // clear AliCDBEntry cache
1528 AliDebug(2, Form("Cache entries to be deleted: %d",fEntryCache.GetEntries()));
1531 // To clean entries one by one
1532 TIter iter(fEntryCache.GetTable());
1534 while((pair= dynamic_cast<TPair*> (iter.Next()))){
1536 TObjString* key = dynamic_cast<TObjString*> (pair->Key());
1537 AliCDBEntry* entry = dynamic_cast<AliCDBEntry*> (pair->Value());
1538 AliDebug(2, Form("Deleting entry: %s", key->GetName()));
1539 if (entry) delete entry;
1540 delete fEntryCache.Remove(key);
1543 fEntryCache.DeleteAll();
1544 AliDebug(2, Form("After deleting - Cache entries: %d",fEntryCache.GetEntries()));
1547 //_____________________________________________________________________________
1548 void AliCDBManager::UnloadFromCache(const char* path){
1549 // unload cached object
1550 // that is remove the entry from the cache and the id from the list of ids
1552 if(!fActiveStorages.GetEntries()) {
1553 AliDebug(2, Form("No active storages. Object \"%s\" is not unloaded from cache", path));
1557 AliCDBPath queryPath(path);
1558 if(!queryPath.IsValid()) return;
1560 if(!queryPath.IsWildcard()) { // path is not wildcard, get it directly from the cache and unload it!
1561 if(fEntryCache.Contains(path)){
1562 AliDebug(2, Form("Unloading object \"%s\" from cache and from list of ids", path));
1563 TObjString pathStr(path);
1564 delete fEntryCache.Remove(&pathStr);
1565 // we do not remove from the list of Id's (it's not very coherent but we leave the
1566 // id for the benefit of the userinfo)
1570 while((id = dynamic_cast<AliCDBId*> (iter.Next()))){
1571 if(queryPath.Comprises(id->GetPath()))
1572 delete fIds->Remove(id);
1575 AliWarning(Form("Cache does not contain object \"%s\"!", path));
1577 AliDebug(2, Form("Cache entries: %d",fEntryCache.GetEntries()));
1581 // path is wildcard: loop on the cache and unload all comprised objects!
1582 TIter iter(fEntryCache.GetTable());
1586 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1587 AliCDBPath entryPath = pair->Key()->GetName();
1588 if(queryPath.Comprises(entryPath)) {
1589 AliDebug(2, Form("Unloading object \"%s\" from cache and from list of ids", entryPath.GetPath().Data()));
1590 TObjString pathStr(entryPath.GetPath());
1591 delete fEntryCache.Remove(&pathStr);
1594 // we do not remove from the list of Id's (it's not very coherent but we leave the
1595 // id for the benefit of the userinfo)
1597 TIter iterids(fIds);
1599 while((anId = dynamic_cast<AliCDBId*> (iterids.Next()))){
1600 AliCDBPath aPath = anId->GetPath();
1601 TString aPathStr = aPath.GetPath();
1602 if(queryPath.Comprises(aPath)) {
1603 delete fIds->Remove(anId);
1608 AliDebug(2,Form("Cache entries and ids removed: %d Remaining: %d",removed,fEntryCache.GetEntries()));
1611 //_____________________________________________________________________________
1612 void AliCDBManager::DestroyActiveStorages() {
1613 // delete list of active storages
1615 fActiveStorages.DeleteAll();
1616 fSpecificStorages.DeleteAll();
1619 //_____________________________________________________________________________
1620 void AliCDBManager::DestroyActiveStorage(AliCDBStorage* /*storage*/) {
1621 // destroys active storage
1624 TIter iter(fActiveStorages.GetTable());
1626 while ((aPair = (TPair*) iter.Next())) {
1627 if(storage == (AliCDBStorage*) aPair->Value())
1628 delete fActiveStorages.Remove(aPair->Key());
1629 storage->Delete(); storage=0x0;
1635 //_____________________________________________________________________________
1636 void AliCDBManager::QueryCDB() {
1637 // query default and specific storages for files valid for fRun. Every storage loads the Ids into its list.
1640 AliError("Run number not yet set! Use AliCDBManager::SetRun.");
1643 if (!fDefaultStorage){
1644 AliError("Default storage is not set! Use AliCDBManager::SetDefaultStorage");
1647 if(fDefaultStorage->GetType() == "alien" || fDefaultStorage->GetType() == "local"){
1648 fDefaultStorage->QueryCDB(fRun);
1650 // AliDebug(2,"Skipping query for valid files, it used only in grid...");
1653 TIter iter(&fSpecificStorages);
1654 TObjString *aCalibType=0;
1655 AliCDBParam* aPar=0;
1656 while((aCalibType = dynamic_cast<TObjString*> (iter.Next()))){
1657 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
1659 AliDebug(2,Form("Querying specific storage %s",aCalibType->GetName()));
1660 AliCDBStorage *aStorage = GetStorage(aPar);
1661 if(aStorage->GetType() == "alien"){
1662 aStorage->QueryCDB(fRun,aCalibType->GetName());
1665 "Skipping query for valid files, it is used only in grid...");
1671 //______________________________________________________________________________________________
1672 const char* AliCDBManager::GetDataTypeName(DataType type) {
1673 // returns the name (string) of the data type
1676 case kCondition: return "Conditions";
1677 case kReference: return "Reference";
1678 case kPrivate: return "Private";
1684 //______________________________________________________________________________________________
1685 Bool_t AliCDBManager::DiffObjects(const char *cdbFile1, const char *cdbFile2) const {
1686 // Compare byte-by-byte the objects contained in the CDB entry in two different files,
1687 // whose name is passed as input
1689 // kTRUE - in case the content of the OCDB object (persistent part) is exactly the same
1690 // kFALSE - otherwise
1692 TString f1Str(cdbFile1);
1693 TString f2Str(cdbFile2);
1694 if (!gGrid && ( f1Str.BeginsWith("alien://") || f2Str.BeginsWith("alien://") ))
1695 TGrid::Connect("alien://");
1697 TFile * f1 = TFile::Open(cdbFile1);
1699 Printf("Cannot open file \"%s\"",cdbFile1);
1702 TFile * f2 = TFile::Open(cdbFile2);
1704 Printf("Cannot open file \"%s\"",cdbFile2);
1708 AliCDBEntry * entry1 = (AliCDBEntry*)f1->Get("AliCDBEntry");
1710 Printf("Cannot get CDB entry from file \"%s\"",cdbFile1);
1713 AliCDBEntry * entry2 = (AliCDBEntry*)f2->Get("AliCDBEntry");
1715 Printf("Cannot get CDB entry from file \"%s\"",cdbFile2);
1719 // stream the two objects in the buffer of two TMessages
1720 TObject* object1 = entry1->GetObject();
1721 TObject* object2 = entry2->GetObject();
1722 TMessage * file1 = new TMessage(TBuffer::kWrite);
1723 file1->WriteObject(object1);
1724 Int_t size1 = file1->Length();
1725 TMessage * file2 = new TMessage(TBuffer::kWrite);
1726 file2->WriteObject(object2);
1727 Int_t size2 = file2->Length();
1729 Printf("Problem 2: OCDB entry of different size (%d,%d)",size1,size2);
1733 // if the two buffers have the same size, check that they are the same byte-by-byte
1735 char* buf1 = file1->Buffer();
1736 char* buf2 = file2->Buffer();
1737 //for (Int_t i=0; i<size1; i++) if (file1->Buffer()[i]!=file2->Buffer()[i]) countDiff++;
1738 for(Int_t i=0; i<size1; i++)
1739 if (buf1[i]!=buf2[i]) countDiff++;
1742 Printf("The CDB objects differ by %d bytes.", countDiff);
1746 Printf("The CDB objects are the same in the two files.");
1750 //______________________________________________________________________________________________
1751 void AliCDBManager::InitShortLived() {
1752 // Init the list of short-lived objects
1753 // currently disabled
1757 // fShortLived = new TList();
1758 // fShortLived->SetOwner(1);
1760 // fShortLived->Add(new TObjString("EMCAL/Calib/Data"));
1762 // fShortLived->Add(new TObjString("HMPID/Calib/Nmean"));
1763 // fShortLived->Add(new TObjString("HMPID/Calib/Qthre"));
1765 // fShortLived->Add(new TObjString("ITS/Calib/CalibSPD"));
1767 // fShortLived->Add(new TObjString("MUON/Calib/Gains"));
1768 // fShortLived->Add(new TObjString("MUON/Calib/HV"));
1769 // fShortLived->Add(new TObjString("MUON/Calib/Pedestals"));
1771 // fShortLived->Add(new TObjString("PHOS/Calib/CpvGainPedestals"));
1772 // fShortLived->Add(new TObjString("PHOS/Calib/EmcGainPedestals"));
1774 // fShortLived->Add(new TObjString("PMD/Calib/Data"));
1776 // fShortLived->Add(new TObjString("TRD/Calib/ChamberGainFactor"));
1777 // fShortLived->Add(new TObjString("TRD/Calib/LocalGainFactor"));
1778 // fShortLived->Add(new TObjString("TRD/Calib/ChamberT0"));
1779 // fShortLived->Add(new TObjString("TRD/Calib/LocalT0"));
1780 // fShortLived->Add(new TObjString("TRD/Calib/ChamberVdrift"));
1781 // fShortLived->Add(new TObjString("TRD/Calib/LocalVdrift"));
1783 // fShortLived->Add(new TObjString("ZDC/Calib/Data"));
1787 //______________________________________________________________________________________________
1788 Bool_t AliCDBManager::IsShortLived(const char* path) {
1789 // returns the name (string) of the data type
1791 if(!fShortLived) return kFALSE;
1793 AliCDBPath aPath(path);
1794 if(!aPath.IsValid()){
1795 AliError(Form("Not a valid path: %s", path));
1799 return fShortLived->Contains(path);
1803 //______________________________________________________________________________________________
1804 ULong64_t AliCDBManager::SetLock(Bool_t lock, ULong64_t key){
1805 // To lock/unlock user must provide the key. A new key is provided after
1806 // each successful lock. User should always backup the returned key and
1807 // use it on next access.
1808 if (fLock == lock) return 0; // nothing to be done
1810 // User wants to lock - check his identity
1812 // Lock has a user - check his key
1814 AliFatal("Wrong key provided to lock CDB. Please remove CDB lock access from your code !");
1819 fKey = gSystem->Now();
1823 // User wants to unlock - check the provided key
1825 AliFatal("Lock is ON: wrong key provided");
1832 ///////////////////////////////////////////////////////////
1833 // AliCDBManager Parameter class //
1834 // interface to specific AliCDBParameter class //
1835 // (AliCDBGridParam, AliCDBLocalParam, AliCDBDumpParam) //
1836 ///////////////////////////////////////////////////////////
1838 AliCDBParam::AliCDBParam():
1846 //_____________________________________________________________________________
1847 AliCDBParam::~AliCDBParam() {