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 "AliCDBMetaData.h"
30 #include <TObjString.h>
35 ClassImp(AliCDBManager)
37 AliCDBManager* AliCDBManager::fgInstance = 0x0;
39 //_____________________________________________________________________________
40 AliCDBManager* AliCDBManager::Instance() {
41 // returns AliCDBManager instance (singleton)
44 fgInstance = new AliCDBManager();
51 //_____________________________________________________________________________
52 void AliCDBManager::Init() {
53 // factory registering
55 RegisterFactory(new AliCDBDumpFactory());
56 RegisterFactory(new AliCDBLocalFactory());
57 // AliCDBGridFactory is registered only if AliEn libraries are enabled in Root
58 if(!gSystem->Exec("root-config --has-alien |grep yes 2>&1 > /dev/null")){ // returns 0 if yes
59 AliInfo("AliEn classes enabled in Root. AliCDBGrid factory registered.");
60 RegisterFactory(new AliCDBGridFactory());
63 //_____________________________________________________________________________
64 void AliCDBManager::Destroy() {
65 // delete ALCDBManager instance and active storages
68 //fgInstance->Delete();
74 //_____________________________________________________________________________
75 AliCDBManager::AliCDBManager():
80 fDefaultStorage(NULL),
87 fFactories.SetOwner(1);
88 fActiveStorages.SetOwner(1);
89 fSpecificStorages.SetOwner(1);
90 fEntryCache.SetOwner(1);
93 //_____________________________________________________________________________
94 AliCDBManager::~AliCDBManager() {
97 DestroyActiveStorages();
100 fDefaultStorage = 0x0;
103 //_____________________________________________________________________________
104 void AliCDBManager::PutActiveStorage(AliCDBParam* param, AliCDBStorage* storage){
105 // put a storage object into the list of active storages
107 fActiveStorages.Add(param, storage);
108 AliDebug(1, Form("Active storages: %d", fActiveStorages.GetEntries()));
111 //_____________________________________________________________________________
112 void AliCDBManager::RegisterFactory(AliCDBStorageFactory* factory) {
113 // add a storage factory to the list of registerd factories
115 if (!fFactories.Contains(factory)) {
116 fFactories.Add(factory);
120 //_____________________________________________________________________________
121 Bool_t AliCDBManager::HasStorage(const char* dbString) const {
122 // check if dbString is a URI valid for one of the registered factories
124 TIter iter(&fFactories);
126 AliCDBStorageFactory* factory=0;
127 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
129 if (factory->Validate(dbString)) {
137 //_____________________________________________________________________________
138 AliCDBParam* AliCDBManager::CreateParameter(const char* dbString) const {
139 // create AliCDBParam object from URI string
141 TIter iter(&fFactories);
143 AliCDBStorageFactory* factory=0;
144 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
145 AliCDBParam* param = factory->CreateParameter(dbString);
146 if(param) return param;
152 //_____________________________________________________________________________
153 AliCDBStorage* AliCDBManager::GetStorage(const char* dbString) {
154 // get storage object from URI string
156 AliCDBParam* param = CreateParameter(dbString);
158 AliError(Form("Failed to activate requested storage! Check URI: %s", dbString));
162 AliCDBStorage* aStorage = GetStorage(param);
168 //_____________________________________________________________________________
169 AliCDBStorage* AliCDBManager::GetStorage(const AliCDBParam* param) {
170 // get storage object from AliCDBParam object
172 // if the list of active storages already contains
173 // the requested storage, return it
174 AliCDBStorage* aStorage = GetActiveStorage(param);
179 TIter iter(&fFactories);
181 AliCDBStorageFactory* factory=0;
183 // loop on the list of registered factories
184 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
186 // each factory tries to create its storage from the parameter
187 aStorage = factory->Create(param);
189 PutActiveStorage(param->CloneParam(), aStorage);
190 aStorage->SetURI(param->GetURI());
192 aStorage->QueryCDB(fRun);
198 AliError(Form("Failed to activate requested storage! Check URI: %s", param->GetURI().Data()));
203 //_____________________________________________________________________________
204 AliCDBStorage* AliCDBManager::GetActiveStorage(const AliCDBParam* param) {
205 // get a storage object from the list of active storages
207 return dynamic_cast<AliCDBStorage*> (fActiveStorages.GetValue(param));
210 //_____________________________________________________________________________
211 TList* AliCDBManager::GetActiveStorages() {
212 // return list of active storages
213 // user has responsibility to delete returned object
215 TList* result = new TList();
217 TIter iter(fActiveStorages.GetTable());
219 while ((aPair = (TPair*) iter.Next())) {
220 result->Add(aPair->Value());
226 //_____________________________________________________________________________
227 void AliCDBManager::SetDrain(const char* dbString) {
228 // set drain storage from URI string
230 fDrainStorage = GetStorage(dbString);
233 //_____________________________________________________________________________
234 void AliCDBManager::SetDrain(const AliCDBParam* param) {
235 // set drain storage from AliCDBParam
237 fDrainStorage = GetStorage(param);
240 //_____________________________________________________________________________
241 void AliCDBManager::SetDrain(AliCDBStorage* storage) {
242 // set drain storage from another active storage
244 fDrainStorage = storage;
247 //_____________________________________________________________________________
248 Bool_t AliCDBManager::Drain(AliCDBEntry *entry) {
249 // drain retrieved object to drain storage
251 AliInfo("Draining into drain storage...");
252 return fDrainStorage->Put(entry);
255 //_____________________________________________________________________________
256 void AliCDBManager::SetDefaultStorage(const char* dbString) {
257 // sets default storage from URI string
259 AliInfo(Form("Setting Default storage to: %s",dbString));
260 fDefaultStorage = GetStorage(dbString);
263 //_____________________________________________________________________________
264 void AliCDBManager::SetDefaultStorage(const AliCDBParam* param) {
265 // set default storage from AliCDBParam object
267 fDrainStorage = GetStorage(param);
270 //_____________________________________________________________________________
271 void AliCDBManager::SetDefaultStorage(AliCDBStorage* storage) {
272 // set default storage from another active storage
274 fDefaultStorage = storage;
277 //_____________________________________________________________________________
278 void AliCDBManager::SetSpecificStorage(const char* calibType, const char* dbString) {
279 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
281 AliCDBParam *aPar = CreateParameter(dbString);
283 SetSpecificStorage(calibType, aPar);
287 //_____________________________________________________________________________
288 void AliCDBManager::SetSpecificStorage(const char* calibType, AliCDBParam* param) {
289 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
290 // Default storage should be defined prior to any specific storages, e.g.:
291 // AliCDBManager::instance()->SetDefaultStorage("alien://");
292 // AliCDBManager::instance()->SetSpecificStorage("TPC/*","local://DB_TPC");
293 // AliCDBManager::instance()->SetSpecificStorage("*/Align/*","local://DB_TPCAlign");
294 // calibType must be a valid CDB path! (3 level folder structure)
296 if(!fDefaultStorage) {
297 AliError("Please activate a default storage first!");
301 AliCDBPath aPath(calibType);
302 if(!aPath.IsValid()){
303 AliError(Form("Not a valid path: %s", calibType));
307 TObjString *objCalibType = new TObjString(aPath.GetPath());
308 if(fSpecificStorages.Contains(objCalibType)){
309 AliWarning(Form("Storage \"%s\" already activated! It will be replaced by the new one",
311 fSpecificStorages.Remove(objCalibType);
314 fSpecificStorages.Add(objCalibType, param->CloneParam());
317 //_____________________________________________________________________________
318 AliCDBStorage* AliCDBManager::GetSpecificStorage(const char* calibType) {
319 // get storage specific for detector or calibration type
321 AliCDBParam *checkPar = (AliCDBParam*) fSpecificStorages.GetValue(calibType);
323 AliError(Form("%s storage not found!",calibType));
326 return GetStorage(checkPar);
331 //_____________________________________________________________________________
332 AliCDBParam* AliCDBManager::SelectSpecificStorage(const TString& path) {
333 // select storage valid for path from the list of specific storages
335 AliCDBPath aPath(path);
336 if(!aPath.IsValid()){
337 AliError(Form("Not a valid path: %s", path.Data()));
341 TIter iter(&fSpecificStorages);
342 TObjString *aCalibType=0;
344 while((aCalibType = (TObjString*) iter.Next())){
345 AliCDBPath calibTypePath(aCalibType->GetName());
346 if(calibTypePath.Comprises(aPath)) {
347 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
354 //_____________________________________________________________________________
355 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path, Int_t runNumber,
356 Int_t version, Int_t subVersion) {
357 // get an AliCDBEntry object from the database
360 // RunNumber is not specified. Try with fRun
362 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
368 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
371 //_____________________________________________________________________________
372 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path,
373 const AliCDBRunRange& runRange, Int_t version,
375 // get an AliCDBEntry object from the database!
377 return Get(AliCDBId(path, runRange, version, subVersion));
380 //_____________________________________________________________________________
381 AliCDBEntry* AliCDBManager::Get(const AliCDBId& query) {
382 // get an AliCDBEntry object from the database
384 if(!fDefaultStorage) {
385 AliError("No storage set!");
389 // check if query's path and runRange are valid
390 // query is invalid also if version is not specified and subversion is!
391 if (!query.IsValid()) {
392 AliError(Form("Invalid query: %s", query.ToString().Data()));
396 // query is not specified if path contains wildcard or run range= [-1,-1]
397 if (!query.IsSpecified()) {
398 AliError(Form("Unspecified query: %s",
399 query.ToString().Data()));
403 if(fCache && query.GetFirstRun() != fRun)
404 AliWarning("Run number explicitly set in query: CDB cache temporarily disabled!");
407 AliCDBEntry *entry=0;
409 // first look into map of cached objects
410 if(fCache && query.GetFirstRun() == fRun)
411 entry = (AliCDBEntry*) fEntryCache.GetValue(query.GetPath());
414 AliInfo(Form("Object %s retrieved from cache !!",query.GetPath().Data()));
418 // Entry is not in cache -> retrieve it from CDB and cache it!!
419 AliCDBStorage *aStorage=0;
420 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
423 aStorage=GetStorage(aPar);
424 TString str = aPar->GetURI();
425 AliDebug(2,Form("Looking into storage: %s",str.Data()));
428 aStorage=GetDefaultStorage();
429 AliDebug(2,"Looking into default storage");
432 entry = aStorage->Get(query);
433 if (!entry) return NULL;
435 if(fCache && (query.GetFirstRun() == fRun)){
436 AliDebug(2,Form("Caching entry %s !",query.GetPath().Data()));
437 CacheEntry(query.GetPath(), entry);
444 //_____________________________________________________________________________
445 TList* AliCDBManager::GetAll(const AliCDBPath& path, Int_t runNumber,
446 Int_t version, Int_t subVersion) {
447 // get multiple AliCDBEntry objects from the database
450 // RunNumber is not specified. Try with fRun
452 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
458 return GetAll(AliCDBId(path, runNumber, runNumber, version,
462 //_____________________________________________________________________________
463 TList* AliCDBManager::GetAll(const AliCDBPath& path,
464 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
465 // get multiple AliCDBEntry objects from the database
467 return GetAll(AliCDBId(path, runRange, version, subVersion));
470 //_____________________________________________________________________________
471 TList* AliCDBManager::GetAll(const AliCDBId& query) {
472 // get multiple AliCDBEntry objects from the database
473 // Warning: this method works correctly only for queries of the type "Detector/*"
474 // and not for more specific queries e.g. "Detector/Calib/*" !
476 if(!fDefaultStorage) {
477 AliError("No storage set!");
481 if (!query.IsValid()) {
482 AliError(Form("Invalid query: %s", query.ToString().Data()));
486 if((fSpecificStorages.GetEntries()>0) && query.GetPath().BeginsWith('*')){
487 // if specific storages are active a query with "*" is ambiguous
488 AliError("Query too generic in this context!");
492 if (query.IsAnyRange()) {
493 AliError(Form("Unspecified run or runrange: %s",
494 query.ToString().Data()));
498 TObjString objStrLev0(query.GetLevel0());
499 //AliCDBParam *aPar = (AliCDBParam*) fSpecificStorages.GetValue(&objStrLev0);
500 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
502 AliCDBStorage *aStorage;
504 aStorage=GetStorage(aPar);
505 TString str = aPar->GetURI();
506 AliDebug(2,Form("Looking into storage: %s",str.Data()));
509 aStorage=GetDefaultStorage();
510 AliDebug(2,"Looking into default storage");
513 TList *result = aStorage->GetAll(query);
518 //_____________________________________________________________________________
519 Bool_t AliCDBManager::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData){
520 // store an AliCDBEntry object into the database
522 AliCDBEntry anEntry(object, id, metaData);
523 return Put(&anEntry);
528 //_____________________________________________________________________________
529 Bool_t AliCDBManager::Put(AliCDBEntry* entry){
530 // store an AliCDBEntry object into the database
532 if(!fDefaultStorage) {
533 AliError("No storage set!");
538 AliError("No entry!");
542 if (!entry->GetId().IsValid()) {
543 AliError(Form("Invalid entry ID: %s",
544 entry->GetId().ToString().Data()));
548 if (!entry->GetId().IsSpecified()) {
549 AliError(Form("Unspecified entry ID: %s",
550 entry->GetId().ToString().Data()));
554 AliCDBId id = entry->GetId();
555 AliCDBParam *aPar = SelectSpecificStorage(id.GetPath());
557 AliCDBStorage *aStorage;
560 aStorage=GetStorage(aPar);
561 TString str = aPar->GetURI();
562 AliDebug(2,Form("Storing object into storage: %s",str.Data()));
565 aStorage=GetDefaultStorage();
566 AliDebug(2,"Storing object into default storage");
569 return aStorage->Put(entry);
574 //_____________________________________________________________________________
575 void AliCDBManager::CacheEntry(const char* path, AliCDBEntry* entry)
577 // cache AliCDBEntry. Cache is valid until run number is changed.
579 AliDebug(2,Form("Filling cache with entry %s",path));
580 fEntryCache.Add(new TObjString(path), entry);
581 AliDebug(2,Form("Cache entries: %d",fEntryCache.GetEntries()));
585 //_____________________________________________________________________________
586 void AliCDBManager::Print(Option_t* /*option*/) const
588 // Print list of active storages and their URIs
589 AliInfo(Form("Run number: %d\n",fRun));
592 output = "Cache is ";
593 if(!fCache) output += "NOT ";
594 output += "ACTIVE\n";
595 AliInfo(output.Data());
597 if(fDefaultStorage) {
598 AliInfo("*** Default Storage: ***");
599 output = Form("%s\n",fDefaultStorage->GetURI().Data());
600 AliInfo(output.Data());
602 if(fSpecificStorages.GetEntries()>0) {
603 AliInfo("*** Specific Storages: ***");
604 TIter iter(fSpecificStorages.GetTable());
606 while((aPair = (TPair*) iter.Next())){
607 output = Form("Key: %s - Storage: %s",
608 ((TObjString*) aPair->Key())->GetName(),
609 ((AliCDBParam*) aPair->Value())->GetURI().Data());
610 AliInfo(output.Data());
615 AliInfo("*** Drain Storage: ***");
616 output = Form("%s\n",fDrainStorage->GetURI().Data());
617 AliInfo(output.Data());
619 AliInfo(Form("Total number of active storages: %d",fActiveStorages.GetEntries()));
623 //_____________________________________________________________________________
624 void AliCDBManager::SetRun(Int_t run)
626 // Sets current run number.
627 // When the run number changes the caching is cleared.
637 //_____________________________________________________________________________
638 void AliCDBManager::ClearCache(){
639 // clear AliCDBEntry cache
641 AliDebug(2,Form("Clearing cache!"));
642 fEntryCache.DeleteAll();
643 AliDebug(2,Form("Cache entries: %d",fEntryCache.GetEntries()));
647 //_____________________________________________________________________________
648 void AliCDBManager::DestroyActiveStorages() {
649 // delete list of active storages
651 fActiveStorages.DeleteAll();
652 fSpecificStorages.DeleteAll();
655 //_____________________________________________________________________________
656 void AliCDBManager::DestroyActiveStorage(AliCDBStorage* /*storage*/) {
657 // destroys active storage
660 TIter iter(fActiveStorages.GetTable());
662 while ((aPair = (TPair*) iter.Next())) {
663 if(storage == (AliCDBStorage*) aPair->Value())
664 delete fActiveStorages.Remove(aPair->Key());
665 storage->Delete(); storage=0x0;
671 //_____________________________________________________________________________
672 void AliCDBManager::QueryCDB() {
673 // query default and specific storages for files valid for fRun. Every storage loads the Ids into its list.
676 AliError("Run number not yet set! Use AliCDBManager::SetRun.");
679 if (!fDefaultStorage){
680 AliError("Default storage is not set! Use AliCDBManager::SetDefaultStorage");
683 if(fDefaultStorage->GetType() == "alien"){
684 fDefaultStorage->QueryCDB(fRun);
686 AliDebug(2,"Skipping query for valid files, it used only in grid...");
689 TIter iter(&fSpecificStorages);
690 TObjString *aCalibType=0;
692 while((aCalibType = dynamic_cast<TObjString*> (iter.Next()))){
693 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
695 AliDebug(2,Form("Querying specific storage %s",aCalibType->GetName()));
696 AliCDBStorage *aStorage = GetStorage(aPar);
697 if(aStorage->GetType() == "alien"){
698 aStorage->QueryCDB(fRun,aCalibType->GetName());
701 "Skipping query for valid files, it is used only in grid...");
708 ///////////////////////////////////////////////////////////
709 // AliCDBManager Parameter class //
710 // interface to specific AliCDBParameter class //
711 // (AliCDBGridParam, AliCDBLocalParam, AliCDBDumpParam) //
712 ///////////////////////////////////////////////////////////
714 AliCDBParam::AliCDBParam():
722 //_____________________________________________________________________________
723 AliCDBParam::~AliCDBParam() {