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 //-------------------------------------------------------------------------
21 #include "AliCDBManager.h"
22 #include "AliCDBStorage.h"
24 #include "AliCDBDump.h"
25 #include "AliCDBLocal.h"
26 #include "AliCDBGrid.h"
27 #include "AliCDBEntry.h"
28 #include "AliCDBHandler.h"
30 #include <TObjString.h>
31 #include <TSAXParser.h>
38 ClassImp(AliCDBManager)
40 //TODO OCDB and Reference folder should not be fully hardcoded but built from run number (or year/LHC period)
41 TString AliCDBManager::fgkCondUri("alien://folder=/alice/cern.ch/user/a/aliprod/testCDB/CDB?user=aliprod");
42 TString AliCDBManager::fgkRefUri("alien://folder=/alice/cern.ch/user/a/aliprod/testCDB/Reference?user=aliprod");
43 TString AliCDBManager::fgkMCIdealStorage("alien://folder=/alice/simulation/2008/v4-15-Release/Ideal");
44 TString AliCDBManager::fgkMCFullStorage("alien://folder=/alice/simulation/2008/v4-15-Release/Full");
45 TString AliCDBManager::fgkMCResidualStorage("alien://folder=/alice/simulation/2008/v4-15-Release/Residual");
46 TString AliCDBManager::fgkOCDBFolderXMLfile("alien:///alice/data/OCDBFoldervsRunRange.xml");
47 AliCDBManager* AliCDBManager::fgInstance = 0x0;
49 //_____________________________________________________________________________
50 AliCDBManager* AliCDBManager::Instance(TMap *entryCache, Int_t run)
52 // returns AliCDBManager instance (singleton)
55 fgInstance = new AliCDBManager();
59 fgInstance->InitFromCache(entryCache,run);
65 //_____________________________________________________________________________
66 void AliCDBManager::Init() {
67 // factory registering
69 RegisterFactory(new AliCDBDumpFactory());
70 RegisterFactory(new AliCDBLocalFactory());
71 // AliCDBGridFactory is registered only if AliEn libraries are enabled in Root
72 if(!gSystem->Exec("root-config --has-alien |grep yes 2>&1 > /dev/null")){ // returns 0 if yes
73 AliInfo("AliEn classes enabled in Root. AliCDBGrid factory registered.");
74 RegisterFactory(new AliCDBGridFactory());
75 fCondParam = CreateParameter(fgkCondUri);
76 fRefParam = CreateParameter(fgkRefUri);
82 //_____________________________________________________________________________
83 void AliCDBManager::InitFromCache(TMap *entryCache, Int_t run) {
84 // initialize manager from existing cache
85 // used on the slaves in case of parallel reconstruction
88 TIter iter(entryCache->GetTable());
91 while((pair = dynamic_cast<TPair*> (iter.Next()))){
92 fEntryCache.Add(pair->Key(),pair->Value());
94 // fEntry is the new owner of the cache
95 fEntryCache.SetOwnerKeyValue(kTRUE,kTRUE);
96 entryCache->SetOwnerKeyValue(kFALSE,kFALSE);
97 AliInfo(Form("%d cache entries have been loaded",fEntryCache.GetEntries()));
100 //_____________________________________________________________________________
101 void AliCDBManager::Destroy() {
102 // delete ALCDBManager instance and active storages
105 //fgInstance->Delete();
111 //_____________________________________________________________________________
112 AliCDBManager::AliCDBManager():
121 fDefaultStorage(NULL),
129 fStartRunLHCPeriod(-1),
130 fEndRunLHCPeriod(-1),
134 // default constuctor
135 fFactories.SetOwner(1);
136 fActiveStorages.SetOwner(1);
137 fSpecificStorages.SetOwner(1);
138 fEntryCache.SetName("CDBEntryCache");
139 fEntryCache.SetOwnerKeyValue(kTRUE,kTRUE);
141 fStorageMap = new TMap();
142 fStorageMap->SetOwner(1);
147 //_____________________________________________________________________________
148 AliCDBManager::~AliCDBManager() {
151 DestroyActiveStorages();
154 fDefaultStorage = 0x0;
155 delete fStorageMap; fStorageMap = 0;
156 delete fIds; fIds = 0;
159 delete fShortLived; fShortLived = 0x0;
162 //_____________________________________________________________________________
163 void AliCDBManager::PutActiveStorage(AliCDBParam* param, AliCDBStorage* storage){
164 // put a storage object into the list of active storages
166 fActiveStorages.Add(param, storage);
167 AliDebug(1, Form("Active storages: %d", fActiveStorages.GetEntries()));
170 //_____________________________________________________________________________
171 void AliCDBManager::RegisterFactory(AliCDBStorageFactory* factory) {
172 // add a storage factory to the list of registerd factories
174 if (!fFactories.Contains(factory)) {
175 fFactories.Add(factory);
179 //_____________________________________________________________________________
180 Bool_t AliCDBManager::HasStorage(const char* dbString) const {
181 // check if dbString is a URI valid for one of the registered factories
183 TIter iter(&fFactories);
185 AliCDBStorageFactory* factory=0;
186 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
188 if (factory->Validate(dbString)) {
196 //_____________________________________________________________________________
197 AliCDBParam* AliCDBManager::CreateParameter(const char* dbString) const {
198 // create AliCDBParam object from URI string
200 TIter iter(&fFactories);
202 AliCDBStorageFactory* factory=0;
203 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
204 AliCDBParam* param = factory->CreateParameter(dbString);
205 if(param) return param;
211 //_____________________________________________________________________________
212 AliCDBStorage* AliCDBManager::GetStorage(const char* dbString) {
213 // get storage object from URI string
215 AliCDBParam* param = CreateParameter(dbString);
217 AliError(Form("Failed to activate requested storage! Check URI: %s", dbString));
221 AliCDBStorage* aStorage = GetStorage(param);
227 //_____________________________________________________________________________
228 AliCDBStorage* AliCDBManager::GetStorage(const AliCDBParam* param) {
229 // get storage object from AliCDBParam object
231 // if the list of active storages already contains
232 // the requested storage, return it
233 AliCDBStorage* aStorage = GetActiveStorage(param);
238 // if lock is ON, cannot activate more storages!
240 if (fDefaultStorage) {
241 AliFatal("Lock is ON, and default storage is already set: "
242 "cannot reset it or activate more storages!");
246 TIter iter(&fFactories);
248 AliCDBStorageFactory* factory=0;
250 // loop on the list of registered factories
251 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
253 // each factory tries to create its storage from the parameter
254 aStorage = factory->Create(param);
256 PutActiveStorage(param->CloneParam(), aStorage);
257 aStorage->SetURI(param->GetURI());
259 if(aStorage->GetType() == "alien"){
260 aStorage->QueryCDB(fRun);
263 "Skipping query for valid files, it is used only in grid...");
270 AliError(Form("Failed to activate requested storage! Check URI: %s", param->GetURI().Data()));
275 //_____________________________________________________________________________
276 AliCDBStorage* AliCDBManager::GetActiveStorage(const AliCDBParam* param) {
277 // get a storage object from the list of active storages
279 return dynamic_cast<AliCDBStorage*> (fActiveStorages.GetValue(param));
282 //_____________________________________________________________________________
283 TList* AliCDBManager::GetActiveStorages() {
284 // return list of active storages
285 // user has responsibility to delete returned object
287 TList* result = new TList();
289 TIter iter(fActiveStorages.GetTable());
291 while ((aPair = (TPair*) iter.Next())) {
292 result->Add(aPair->Value());
298 //_____________________________________________________________________________
299 void AliCDBManager::SetDrain(const char* dbString) {
300 // set drain storage from URI string
302 fDrainStorage = GetStorage(dbString);
305 //_____________________________________________________________________________
306 void AliCDBManager::SetDrain(const AliCDBParam* param) {
307 // set drain storage from AliCDBParam
309 fDrainStorage = GetStorage(param);
312 //_____________________________________________________________________________
313 void AliCDBManager::SetDrain(AliCDBStorage* storage) {
314 // set drain storage from another active storage
316 fDrainStorage = storage;
319 //_____________________________________________________________________________
320 Bool_t AliCDBManager::Drain(AliCDBEntry *entry) {
321 // drain retrieved object to drain storage
323 AliDebug(2, "Draining into drain storage...");
324 return fDrainStorage->Put(entry);
327 //____________________________________________________________________________
328 void AliCDBManager::SetDefaultStorage(const char* dbString) {
329 // sets default storage from URI string
331 // checking whether we are in the raw case
332 TString dbStringTemp(dbString);
333 if (dbStringTemp == "raw://")
336 AliInfo("Setting the run-number will set the corresponding OCDB for raw data reconstruction.");
337 AliInfo("Connecting to the grid...");
339 TGrid::Connect("alien://","");
341 AliError("Connection to alien failed!");
348 AliCDBStorage* bckStorage = fDefaultStorage;
350 fDefaultStorage = GetStorage(dbString);
352 if(!fDefaultStorage) return;
354 if(bckStorage && (fDefaultStorage != bckStorage)){
355 AliWarning("Existing default storage replaced: clearing cache!");
359 if (fStorageMap->Contains("default")) {
360 delete fStorageMap->Remove(fStorageMap->GetValue("default"));
362 fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
364 //_____________________________________________________________________________
365 void AliCDBManager::SetDefaultStorage(const AliCDBParam* param) {
366 // set default storage from AliCDBParam object
368 AliCDBStorage* bckStorage = fDefaultStorage;
370 fDefaultStorage = GetStorage(param);
372 if(!fDefaultStorage) return;
374 if(bckStorage && (fDefaultStorage != bckStorage)){
375 AliWarning("Existing default storage replaced: clearing cache!");
379 if (fStorageMap->Contains("default")) {
380 delete fStorageMap->Remove(fStorageMap->GetValue("default"));
382 fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
385 //_____________________________________________________________________________
386 void AliCDBManager::SetDefaultStorage(AliCDBStorage* storage) {
387 // set default storage from another active storage
389 // if lock is ON, cannot activate more storages!
391 if (fDefaultStorage) {
392 AliFatal("Lock is ON, and default storage is already set: "
393 "cannot reset it or activate more storages!");
398 UnsetDefaultStorage();
402 AliCDBStorage* bckStorage = fDefaultStorage;
404 fDefaultStorage = storage;
406 if(bckStorage && (fDefaultStorage != bckStorage)){
407 AliWarning("Existing default storage replaced: clearing cache!");
411 if (fStorageMap->Contains("default")) {
412 delete fStorageMap->Remove(fStorageMap->GetValue("default"));
414 fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
417 //_____________________________________________________________________________
418 void AliCDBManager::SetDefaultStorage(const char* mcString, const char* simType) {
419 // sets default storage for MC data
420 // mcString MUST be "MC",
421 // simType can be "Ideal","Residual","Full"
423 TString strmcString(mcString);
424 TString strsimType(simType);
426 if (strmcString != "MC"){
427 AliFatal("Method requires first string to be MC!");
430 if (strsimType == "Ideal"){
431 dbString = fgkMCIdealStorage;
433 else if (strsimType == "Full"){
434 dbString = fgkMCFullStorage;
436 else if (strsimType == "Residual"){
437 dbString = fgkMCResidualStorage;
440 AliFatal("Error in setting the storage for MC data, second argument MUST be either \"Ideal\" or \"Full\" or \"Residual\".");
443 SetDefaultStorage(dbString.Data());
444 if(!fDefaultStorage) AliFatal(Form("%s storage not there! Please check!",fLHCPeriod.Data()));
447 //_____________________________________________________________________________
448 void AliCDBManager::SetDefaultStorageFromRun(Int_t run) {
449 // set default storage from the run number - to be used only with raw data
451 // if lock is ON, cannot activate more storages!
453 if (fDefaultStorage) {
454 AliFatal("Lock is ON, and default storage is already set: "
455 "cannot activate default storage from run number");
459 // retrieve XML file from alien
461 TGrid::Connect("alien://","");
463 AliError("Connection to alien failed!");
468 TString rndname = "/tmp/";
469 rndname += "OCDBFolderXML.";
470 rndname += uuid.AsString();
472 AliDebug(2, Form("file to be copied = %s", fgkOCDBFolderXMLfile.Data()));
473 if (!TFile::Cp(fgkOCDBFolderXMLfile.Data(), rndname.Data())) {
474 AliFatal(Form("Cannot make a local copy of OCDBFolder xml file in %s",rndname.Data()));
476 AliCDBHandler* saxcdb = new AliCDBHandler();
478 TSAXParser *saxParser = new TSAXParser();
479 saxParser->ConnectToHandler("AliCDBHandler", saxcdb);
480 saxParser->ParseFile(rndname.Data());
481 AliInfo(Form(" LHC folder = %s", saxcdb->GetOCDBFolder().Data()));
482 AliInfo(Form(" LHC period start run = %d", saxcdb->GetStartRunRange()));
483 AliInfo(Form(" LHC period end run = %d", saxcdb->GetEndRunRange()));
484 fLHCPeriod = saxcdb->GetOCDBFolder();
485 fStartRunLHCPeriod = saxcdb->GetStartRunRange();
486 fEndRunLHCPeriod = saxcdb->GetEndRunRange();
488 SetDefaultStorage(fLHCPeriod.Data());
489 if(!fDefaultStorage) AliFatal(Form("%s storage not there! Please check!",fLHCPeriod.Data()));
493 //_____________________________________________________________________________
494 void AliCDBManager::UnsetDefaultStorage() {
495 // Unset default storage
497 // if lock is ON, action is forbidden!
499 if (fDefaultStorage) {
500 AliFatal("Lock is ON: cannot unset default storage!");
504 if (fDefaultStorage) {
505 AliWarning("Clearing cache!");
509 fDefaultStorage = 0x0;
512 //_____________________________________________________________________________
513 void AliCDBManager::SetSpecificStorage(const char* calibType, const char* dbString) {
514 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
516 AliCDBParam *aPar = CreateParameter(dbString);
518 SetSpecificStorage(calibType, aPar);
522 //_____________________________________________________________________________
523 void AliCDBManager::SetSpecificStorage(const char* calibType, AliCDBParam* param) {
524 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
525 // Default storage should be defined prior to any specific storages, e.g.:
526 // AliCDBManager::instance()->SetDefaultStorage("alien://");
527 // AliCDBManager::instance()->SetSpecificStorage("TPC/*","local://DB_TPC");
528 // AliCDBManager::instance()->SetSpecificStorage("*/Align/*","local://DB_TPCAlign");
529 // calibType must be a valid CDB path! (3 level folder structure)
532 if(!fDefaultStorage && !fRaw) {
533 AliError("Please activate a default storage first!");
538 AliCDBPath aPath(calibType);
539 if(!aPath.IsValid()){
540 AliError(Form("Not a valid path: %s", calibType));
544 TObjString *objCalibType = new TObjString(aPath.GetPath());
545 if(fSpecificStorages.Contains(objCalibType)){
546 AliWarning(Form("Storage \"%s\" already activated! It will be replaced by the new one",
548 AliCDBParam *checkPar = dynamic_cast<AliCDBParam*> (fSpecificStorages.GetValue(calibType));
549 if(checkPar) delete checkPar;
550 delete fSpecificStorages.Remove(objCalibType);
552 AliCDBStorage *aStorage = GetStorage(param);
553 if(!aStorage) return;
555 fSpecificStorages.Add(objCalibType, param->CloneParam());
557 if(fStorageMap->Contains(objCalibType)){
558 delete fStorageMap->Remove(objCalibType);
560 fStorageMap->Add(objCalibType->Clone(), new TObjString(param->GetURI()));
564 //_____________________________________________________________________________
565 AliCDBStorage* AliCDBManager::GetSpecificStorage(const char* calibType) {
566 // get storage specific for detector or calibration type
568 AliCDBPath calibPath(calibType);
569 if(!calibPath.IsValid()) return NULL;
571 AliCDBParam *checkPar = (AliCDBParam*) fSpecificStorages.GetValue(calibPath.GetPath());
573 AliError(Form("%s storage not found!", calibType));
576 return GetStorage(checkPar);
581 //_____________________________________________________________________________
582 AliCDBParam* AliCDBManager::SelectSpecificStorage(const TString& path) {
583 // select storage valid for path from the list of specific storages
585 AliCDBPath aPath(path);
586 if(!aPath.IsValid()) return NULL;
588 TIter iter(&fSpecificStorages);
589 TObjString *aCalibType=0;
590 AliCDBPath tmpPath("null/null/null");
592 while((aCalibType = (TObjString*) iter.Next())){
593 AliCDBPath calibTypePath(aCalibType->GetName());
594 if(calibTypePath.Comprises(aPath)) {
595 if(calibTypePath.Comprises(tmpPath)) continue;
596 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
597 tmpPath.SetPath(calibTypePath.GetPath());
603 //_____________________________________________________________________________
604 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path, Int_t runNumber,
605 Int_t version, Int_t subVersion) {
606 // get an AliCDBEntry object from the database
609 // RunNumber is not specified. Try with fRun
611 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
617 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
620 //_____________________________________________________________________________
621 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path,
622 const AliCDBRunRange& runRange, Int_t version,
624 // get an AliCDBEntry object from the database!
626 return Get(AliCDBId(path, runRange, version, subVersion));
629 //_____________________________________________________________________________
630 AliCDBEntry* AliCDBManager::Get(const AliCDBId& query) {
631 // get an AliCDBEntry object from the database
633 // check if query's path and runRange are valid
634 // query is invalid also if version is not specified and subversion is!
635 if (!query.IsValid()) {
636 AliError(Form("Invalid query: %s", query.ToString().Data()));
640 // query is not specified if path contains wildcard or run range= [-1,-1]
641 if (!query.IsSpecified()) {
642 AliError(Form("Unspecified query: %s",
643 query.ToString().Data()));
647 if(fLock && query.GetFirstRun() != fRun)
648 AliFatal("Lock is ON: cannot use different run number than the internal one!");
650 if(fCache && query.GetFirstRun() != fRun)
651 AliWarning("Run number explicitly set in query: CDB cache temporarily disabled!");
653 AliCDBEntry *entry=0;
655 // first look into map of cached objects
656 if(fCache && query.GetFirstRun() == fRun)
657 entry = (AliCDBEntry*) fEntryCache.GetValue(query.GetPath());
660 AliDebug(2, Form("Object %s retrieved from cache !!",query.GetPath().Data()));
664 if(!fDefaultStorage) {
665 AliError("No storage set!");
668 // Entry is not in cache -> retrieve it from CDB and cache it!!
669 AliCDBStorage *aStorage=0;
670 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
671 // Bool_t usedDefStorage=kTRUE;
674 aStorage=GetStorage(aPar);
675 TString str = aPar->GetURI();
676 AliDebug(2,Form("Looking into storage: %s",str.Data()));
677 // usedDefStorage=kFALSE;
680 aStorage=GetDefaultStorage();
681 AliDebug(2,"Looking into default storage");
684 entry = aStorage->Get(query);
686 if(entry && fCache && (query.GetFirstRun() == fRun)){
687 CacheEntry(query.GetPath(), entry);
690 if(entry && !fIds->Contains(&entry->GetId())){
691 fIds->Add(entry->GetId().Clone());
699 //_____________________________________________________________________________
700 const char* AliCDBManager::GetURI(const char* path) {
701 // return the URI of the storage where to look for path
703 if(!IsDefaultStorageSet()) return 0;
705 AliCDBParam *aPar=SelectSpecificStorage(path);
708 return aPar->GetURI().Data();
711 return GetDefaultStorage()->GetURI().Data();
717 //_____________________________________________________________________________
718 AliCDBId* AliCDBManager::GetId(const AliCDBPath& path, Int_t runNumber,
719 Int_t version, Int_t subVersion) {
720 // get the AliCDBId of the valid object from the database (does not retrieve the object)
721 // User must delete returned object!
724 // RunNumber is not specified. Try with fRun
726 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
732 return GetId(AliCDBId(path, runNumber, runNumber, version, subVersion));
735 //_____________________________________________________________________________
736 AliCDBId* AliCDBManager::GetId(const AliCDBPath& path,
737 const AliCDBRunRange& runRange, Int_t version,
739 // get the AliCDBId of the valid object from the database (does not retrieve the object)
740 // User must delete returned object!
742 return GetId(AliCDBId(path, runRange, version, subVersion));
745 //_____________________________________________________________________________
746 AliCDBId* AliCDBManager::GetId(const AliCDBId& query) {
747 // get the AliCDBId of the valid object from the database (does not retrieve the object)
748 // User must delete returned object!
750 if(!fDefaultStorage) {
751 AliError("No storage set!");
755 // check if query's path and runRange are valid
756 // query is invalid also if version is not specified and subversion is!
757 if (!query.IsValid()) {
758 AliError(Form("Invalid query: %s", query.ToString().Data()));
762 // query is not specified if path contains wildcard or run range= [-1,-1]
763 if (!query.IsSpecified()) {
764 AliError(Form("Unspecified query: %s",
765 query.ToString().Data()));
769 if(fCache && query.GetFirstRun() != fRun)
770 AliWarning("Run number explicitly set in query: CDB cache temporarily disabled!");
772 AliCDBEntry* entry = 0;
774 // first look into map of cached objects
775 if(fCache && query.GetFirstRun() == fRun)
776 entry = (AliCDBEntry*) fEntryCache.GetValue(query.GetPath());
779 AliDebug(2, Form("Object %s retrieved from cache !!",query.GetPath().Data()));
780 return dynamic_cast<AliCDBId*> (entry->GetId().Clone());
783 // Entry is not in cache -> retrieve it from CDB and cache it!!
784 AliCDBStorage *aStorage=0;
785 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
788 aStorage=GetStorage(aPar);
789 TString str = aPar->GetURI();
790 AliDebug(2,Form("Looking into storage: %s",str.Data()));
793 aStorage=GetDefaultStorage();
794 AliDebug(2,"Looking into default storage");
797 return aStorage->GetId(query);
801 //_____________________________________________________________________________
802 TList* AliCDBManager::GetAll(const AliCDBPath& path, Int_t runNumber,
803 Int_t version, Int_t subVersion) {
804 // get multiple AliCDBEntry objects from the database
807 // RunNumber is not specified. Try with fRun
809 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
815 return GetAll(AliCDBId(path, runNumber, runNumber, version,
819 //_____________________________________________________________________________
820 TList* AliCDBManager::GetAll(const AliCDBPath& path,
821 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
822 // get multiple AliCDBEntry objects from the database
824 return GetAll(AliCDBId(path, runRange, version, subVersion));
827 //_____________________________________________________________________________
828 TList* AliCDBManager::GetAll(const AliCDBId& query) {
829 // get multiple AliCDBEntry objects from the database
830 // Warning: this method works correctly only for queries of the type "Detector/*"
831 // and not for more specific queries e.g. "Detector/Calib/*" !
832 // Warning #2: Entries are cached, but GetAll will keep on retrieving objects from OCDB!
833 // To get an object from cache use Get() function
835 if(!fDefaultStorage) {
836 AliError("No storage set!");
840 if (!query.IsValid()) {
841 AliError(Form("Invalid query: %s", query.ToString().Data()));
845 if((fSpecificStorages.GetEntries()>0) && query.GetPath().BeginsWith('*')){
846 // if specific storages are active a query with "*" is ambiguous
847 AliError("Query too generic in this context!");
851 if (query.IsAnyRange()) {
852 AliError(Form("Unspecified run or runrange: %s",
853 query.ToString().Data()));
857 if(fLock && query.GetFirstRun() != fRun)
858 AliFatal("Lock is ON: cannot use different run number than the internal one!");
860 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
862 AliCDBStorage *aStorage;
864 aStorage=GetStorage(aPar);
865 AliDebug(2,Form("Looking into storage: %s", aPar->GetURI().Data()));
868 aStorage=GetDefaultStorage();
869 AliDebug(2,"Looking into default storage");
873 if(aStorage) result = aStorage->GetAll(query);
874 if(!result) return 0;
876 // loop on result to check whether entries should be re-queried with specific storages
877 if(fSpecificStorages.GetEntries()>0 && ! (fSpecificStorages.GetEntries() == 1 && aPar)) {
878 AliInfo("Now look into all other specific storages...");
881 AliCDBEntry* chkEntry=0;
883 while((chkEntry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
884 AliCDBId& chkId = chkEntry->GetId();
885 AliDebug(2, Form("Checking id %s ", chkId.GetPath().Data()));
886 AliCDBParam *chkPar=SelectSpecificStorage(chkId.GetPath());
887 if (!chkPar || aPar == chkPar) continue;
888 AliCDBStorage *chkStorage = GetStorage(chkPar);
889 AliDebug(2, Form("Found specific storage! %s", chkPar->GetURI().Data()));
891 AliCDBEntry *newEntry=0;
892 chkId.SetRunRange(query.GetFirstRun(), query.GetLastRun());
893 chkId.SetVersion(query.GetVersion());
894 chkId.SetSubVersion(query.GetSubVersion());
896 if(chkStorage) newEntry = chkStorage->Get(chkId);
897 if(!newEntry) continue;
899 // object is found in specific storage: replace entry in the result list!
900 chkEntry->SetOwner(1);
901 delete result->Remove(chkEntry);
902 result->AddFirst(newEntry);
905 Int_t nEntries = result->GetEntries();
906 AliInfo("After look into other specific storages, result list is:");
907 for(int i=0; i<nEntries;i++){
908 AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
909 AliInfo(Form("%s",entry->GetId().ToString().Data()));
915 AliCDBEntry* entry=0;
916 while((entry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
918 if(!fIds->Contains(&entry->GetId())){
919 fIds->Add(entry->GetId().Clone());
921 if(fCache && (query.GetFirstRun() == fRun)){
922 CacheEntry(entry->GetId().GetPath(), entry);
930 //_____________________________________________________________________________
931 Bool_t AliCDBManager::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData, const DataType type){
932 // store an AliCDBEntry object into the database
935 AliError("Null Entry! No storage will be done!");
939 AliCDBEntry anEntry(object, id, metaData);
940 return Put(&anEntry, type);
945 //_____________________________________________________________________________
946 Bool_t AliCDBManager::Put(AliCDBEntry* entry, DataType type){
947 // store an AliCDBEntry object into the database
949 if(type == kPrivate && !fDefaultStorage) {
950 AliError("No storage set!");
954 if (entry->GetObject()==0x0){
955 AliError("No valid object in CDB entry!");
960 AliError("No entry!");
964 if (!entry->GetId().IsValid()) {
965 AliError(Form("Invalid entry ID: %s",
966 entry->GetId().ToString().Data()));
970 if (!entry->GetId().IsSpecified()) {
971 AliError(Form("Unspecified entry ID: %s",
972 entry->GetId().ToString().Data()));
976 AliCDBId id = entry->GetId();
977 AliCDBParam *aPar = SelectSpecificStorage(id.GetPath());
979 AliCDBStorage *aStorage=0;
982 aStorage=GetStorage(aPar);
986 aStorage = GetStorage(fCondParam);
989 aStorage = GetStorage(fRefParam);
992 aStorage = GetDefaultStorage();
997 AliDebug(2,Form("Storing object into storage: %s", aStorage->GetURI().Data()));
999 Bool_t result = aStorage->Put(entry, type);
1001 if(fRun >= 0) QueryCDB();
1008 //_____________________________________________________________________________
1009 void AliCDBManager::CacheEntry(const char* path, AliCDBEntry* entry)
1011 // cache AliCDBEntry. Cache is valid until run number is changed.
1013 AliCDBEntry *chkEntry = dynamic_cast<AliCDBEntry*> (fEntryCache.GetValue(path));
1016 AliDebug(2, Form("Object %s already in cache !!", path));
1019 AliDebug(2,Form("Caching entry %s", path));
1022 fEntryCache.Add(new TObjString(path), entry);
1023 AliDebug(2,Form("Cache entries: %d", fEntryCache.GetEntries()));
1027 //_____________________________________________________________________________
1028 void AliCDBManager::Print(Option_t* /*option*/) const
1030 // Print list of active storages and their URIs
1032 TString output=Form("Run number = %d; ",fRun);
1033 output += "Cache is ";
1034 if(!fCache) output += "NOT ";
1035 output += Form("ACTIVE; Number of active storages: %d\n",fActiveStorages.GetEntries());
1037 if(fDefaultStorage) {
1038 output += Form("\t*** Default Storage URI: \"%s\"\n",fDefaultStorage->GetURI().Data());
1039 // AliInfo(output.Data());
1041 if(fSpecificStorages.GetEntries()>0) {
1042 TIter iter(fSpecificStorages.GetTable());
1045 while((aPair = (TPair*) iter.Next())){
1046 output += Form("\t*** Specific storage %d: Path \"%s\" -> URI \"%s\"\n",
1047 i++, ((TObjString*) aPair->Key())->GetName(),
1048 ((AliCDBParam*) aPair->Value())->GetURI().Data());
1052 output += Form("*** Drain Storage URI: %s\n",fDrainStorage->GetURI().Data());
1054 AliInfo(output.Data());
1057 //_____________________________________________________________________________
1058 void AliCDBManager::SetRun(Int_t run)
1060 // Sets current run number.
1061 // When the run number changes the caching is cleared.
1066 if(fLock && fRun >= 0) {
1067 AliFatal("Lock is ON, cannot reset run number!");
1072 // here the LHCPeriod xml file is parsed; the string containing the correct period is returned; the default storage is set
1073 if (fStartRunLHCPeriod <= run && fEndRunLHCPeriod >= run){
1074 AliInfo("LHCPeriod alien folder for current run already in memory");
1076 SetDefaultStorageFromRun(run);
1077 if(fEntryCache.GetEntries()!=0) ClearCache();
1085 //_____________________________________________________________________________
1086 void AliCDBManager::ClearCache(){
1087 // clear AliCDBEntry cache
1089 AliDebug(2, Form("Cache entries to be deleted: %d",fEntryCache.GetEntries()));
1092 // To clean entries one by one
1093 TIter iter(fEntryCache.GetTable());
1095 while((pair= dynamic_cast<TPair*> (iter.Next()))){
1097 TObjString* key = dynamic_cast<TObjString*> (pair->Key());
1098 AliCDBEntry* entry = dynamic_cast<AliCDBEntry*> (pair->Value());
1099 AliDebug(2, Form("Deleting entry: %s", key->GetName()));
1100 if (entry) delete entry;
1101 delete fEntryCache.Remove(key);
1104 fEntryCache.DeleteAll();
1105 AliDebug(2, Form("After deleting - Cache entries: %d",fEntryCache.GetEntries()));
1108 //_____________________________________________________________________________
1109 void AliCDBManager::UnloadFromCache(const char* path){
1110 // unload cached object
1112 if(!fActiveStorages.GetEntries()) {
1113 AliDebug(2, Form("No active storages. Object \"%s\" is not unloaded from cache", path));
1117 AliCDBPath queryPath(path);
1118 if(!queryPath.IsValid()) return;
1120 if(!queryPath.IsWildcard()) { // path is not wildcard, get it directly from the cache and unload it!
1121 if(fEntryCache.Contains(path)){
1122 AliDebug(2, Form("Unloading object \"%s\" from cache", path));
1123 TObjString pathStr(path);
1124 delete fEntryCache.Remove(&pathStr);
1126 AliError(Form("Cache does not contain object \"%s\"!", path))
1128 AliDebug(2, Form("Cache entries: %d",fEntryCache.GetEntries()));
1132 // path is wildcard: loop on the cache and unload all comprised objects!
1133 TIter iter(fEntryCache.GetTable());
1136 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1137 AliCDBPath entryPath = pair->Key()->GetName();
1138 if(queryPath.Comprises(entryPath)) {
1139 AliDebug(2, Form("Unloading object \"%s\" from cache", entryPath.GetPath().Data()));
1140 TObjString pathStr(entryPath.GetPath().Data());
1141 delete fEntryCache.Remove(&pathStr);
1144 AliDebug(2,Form("Cache entries: %d",fEntryCache.GetEntries()));
1147 //_____________________________________________________________________________
1148 void AliCDBManager::DestroyActiveStorages() {
1149 // delete list of active storages
1151 fActiveStorages.DeleteAll();
1152 fSpecificStorages.DeleteAll();
1155 //_____________________________________________________________________________
1156 void AliCDBManager::DestroyActiveStorage(AliCDBStorage* /*storage*/) {
1157 // destroys active storage
1160 TIter iter(fActiveStorages.GetTable());
1162 while ((aPair = (TPair*) iter.Next())) {
1163 if(storage == (AliCDBStorage*) aPair->Value())
1164 delete fActiveStorages.Remove(aPair->Key());
1165 storage->Delete(); storage=0x0;
1171 //_____________________________________________________________________________
1172 void AliCDBManager::QueryCDB() {
1173 // query default and specific storages for files valid for fRun. Every storage loads the Ids into its list.
1176 AliError("Run number not yet set! Use AliCDBManager::SetRun.");
1179 if (!fDefaultStorage){
1180 AliError("Default storage is not set! Use AliCDBManager::SetDefaultStorage");
1183 if(fDefaultStorage->GetType() == "alien"){
1184 fDefaultStorage->QueryCDB(fRun);
1186 AliDebug(2,"Skipping query for valid files, it used only in grid...");
1189 TIter iter(&fSpecificStorages);
1190 TObjString *aCalibType=0;
1191 AliCDBParam* aPar=0;
1192 while((aCalibType = dynamic_cast<TObjString*> (iter.Next()))){
1193 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
1195 AliDebug(2,Form("Querying specific storage %s",aCalibType->GetName()));
1196 AliCDBStorage *aStorage = GetStorage(aPar);
1197 if(aStorage->GetType() == "alien"){
1198 aStorage->QueryCDB(fRun,aCalibType->GetName());
1201 "Skipping query for valid files, it is used only in grid...");
1207 //______________________________________________________________________________________________
1208 const char* AliCDBManager::GetDataTypeName(DataType type)
1210 // returns the name (string) of the data type
1213 case kCondition: return "Conditions";
1214 case kReference: return "Reference";
1215 case kPrivate: return "Private";
1221 //______________________________________________________________________________________________
1222 void AliCDBManager::InitShortLived()
1224 // Init the list of short-lived objects
1225 // currently disabled
1229 // fShortLived = new TList();
1230 // fShortLived->SetOwner(1);
1232 // fShortLived->Add(new TObjString("EMCAL/Calib/Data"));
1234 // fShortLived->Add(new TObjString("HMPID/Calib/Nmean"));
1235 // fShortLived->Add(new TObjString("HMPID/Calib/Qthre"));
1237 // fShortLived->Add(new TObjString("ITS/Calib/CalibSPD"));
1239 // fShortLived->Add(new TObjString("MUON/Calib/Gains"));
1240 // fShortLived->Add(new TObjString("MUON/Calib/HV"));
1241 // fShortLived->Add(new TObjString("MUON/Calib/Pedestals"));
1243 // fShortLived->Add(new TObjString("PHOS/Calib/CpvGainPedestals"));
1244 // fShortLived->Add(new TObjString("PHOS/Calib/EmcGainPedestals"));
1246 // fShortLived->Add(new TObjString("PMD/Calib/Data"));
1248 // fShortLived->Add(new TObjString("TRD/Calib/ChamberGainFactor"));
1249 // fShortLived->Add(new TObjString("TRD/Calib/LocalGainFactor"));
1250 // fShortLived->Add(new TObjString("TRD/Calib/ChamberT0"));
1251 // fShortLived->Add(new TObjString("TRD/Calib/LocalT0"));
1252 // fShortLived->Add(new TObjString("TRD/Calib/ChamberVdrift"));
1253 // fShortLived->Add(new TObjString("TRD/Calib/LocalVdrift"));
1255 // fShortLived->Add(new TObjString("ZDC/Calib/Data"));
1259 //______________________________________________________________________________________________
1260 Bool_t AliCDBManager::IsShortLived(const char* path)
1262 // returns the name (string) of the data type
1264 if(!fShortLived) return kFALSE;
1266 AliCDBPath aPath(path);
1267 if(!aPath.IsValid()){
1268 AliError(Form("Not a valid path: %s", path));
1272 return fShortLived->Contains(path);
1276 //______________________________________________________________________________________________
1277 ULong_t AliCDBManager::SetLock(Bool_t lock, ULong_t key){
1278 // To lock/unlock user must provide the key. A new key is provided after
1279 // each successful lock. User should always backup the returned key and
1280 // use it on next access.
1281 if (fLock == lock) return 0; // nothing to be done
1283 // User wants to lock - check his identity
1285 // Lock has a user - check his key
1287 AliFatal("Wrong key provided to lock CDB. Please remove CDB lock access from your code !");
1292 fKey = gSystem->Now();
1296 // User wants to unlock - check the provided key
1298 AliFatal("Lock is ON: wrong key provided");
1305 ///////////////////////////////////////////////////////////
1306 // AliCDBManager Parameter class //
1307 // interface to specific AliCDBParameter class //
1308 // (AliCDBGridParam, AliCDBLocalParam, AliCDBDumpParam) //
1309 ///////////////////////////////////////////////////////////
1311 AliCDBParam::AliCDBParam():
1319 //_____________________________________________________________________________
1320 AliCDBParam::~AliCDBParam() {