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 //TODO OCDB and Reference folder should not be fully hardcoded but built from run number (or year/LHC period)
38 TString AliCDBManager::fgkCondUri("alien://folder=/alice/cern.ch/user/a/aliprod/testCDB/CDB?user=aliprod");
39 TString AliCDBManager::fgkRefUri("alien://folder=/alice/cern.ch/user/a/aliprod/testCDB/Reference?user=aliprod");
40 AliCDBManager* AliCDBManager::fgInstance = 0x0;
42 //_____________________________________________________________________________
43 AliCDBManager* AliCDBManager::Instance()
45 // returns AliCDBManager instance (singleton)
48 fgInstance = new AliCDBManager();
55 //_____________________________________________________________________________
56 void AliCDBManager::Init() {
57 // factory registering
59 RegisterFactory(new AliCDBDumpFactory());
60 RegisterFactory(new AliCDBLocalFactory());
61 // AliCDBGridFactory is registered only if AliEn libraries are enabled in Root
62 if(!gSystem->Exec("root-config --has-alien |grep yes 2>&1 > /dev/null")){ // returns 0 if yes
63 AliInfo("AliEn classes enabled in Root. AliCDBGrid factory registered.");
64 RegisterFactory(new AliCDBGridFactory());
65 fCondParam = CreateParameter(fgkCondUri);
66 fRefParam = CreateParameter(fgkRefUri);
69 //_____________________________________________________________________________
70 void AliCDBManager::Destroy() {
71 // delete ALCDBManager instance and active storages
74 //fgInstance->Delete();
80 //_____________________________________________________________________________
81 AliCDBManager::AliCDBManager():
88 fDefaultStorage(NULL),
95 fFactories.SetOwner(1);
96 fActiveStorages.SetOwner(1);
97 fSpecificStorages.SetOwner(1);
98 fEntryCache.SetOwner(1);
101 //_____________________________________________________________________________
102 AliCDBManager::~AliCDBManager() {
105 DestroyActiveStorages();
108 fDefaultStorage = 0x0;
113 //_____________________________________________________________________________
114 void AliCDBManager::PutActiveStorage(AliCDBParam* param, AliCDBStorage* storage){
115 // put a storage object into the list of active storages
117 fActiveStorages.Add(param, storage);
118 AliDebug(1, Form("Active storages: %d", fActiveStorages.GetEntries()));
121 //_____________________________________________________________________________
122 void AliCDBManager::RegisterFactory(AliCDBStorageFactory* factory) {
123 // add a storage factory to the list of registerd factories
125 if (!fFactories.Contains(factory)) {
126 fFactories.Add(factory);
130 //_____________________________________________________________________________
131 Bool_t AliCDBManager::HasStorage(const char* dbString) const {
132 // check if dbString is a URI valid for one of the registered factories
134 TIter iter(&fFactories);
136 AliCDBStorageFactory* factory=0;
137 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
139 if (factory->Validate(dbString)) {
147 //_____________________________________________________________________________
148 AliCDBParam* AliCDBManager::CreateParameter(const char* dbString) const {
149 // create AliCDBParam object from URI string
151 TIter iter(&fFactories);
153 AliCDBStorageFactory* factory=0;
154 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
155 AliCDBParam* param = factory->CreateParameter(dbString);
156 if(param) return param;
162 //_____________________________________________________________________________
163 AliCDBStorage* AliCDBManager::GetStorage(const char* dbString) {
164 // get storage object from URI string
166 AliCDBParam* param = CreateParameter(dbString);
168 AliError(Form("Failed to activate requested storage! Check URI: %s", dbString));
172 AliCDBStorage* aStorage = GetStorage(param);
178 //_____________________________________________________________________________
179 AliCDBStorage* AliCDBManager::GetStorage(const AliCDBParam* param) {
180 // get storage object from AliCDBParam object
182 // if the list of active storages already contains
183 // the requested storage, return it
184 AliCDBStorage* aStorage = GetActiveStorage(param);
189 TIter iter(&fFactories);
191 AliCDBStorageFactory* factory=0;
193 // loop on the list of registered factories
194 while ((factory = (AliCDBStorageFactory*) iter.Next())) {
196 // each factory tries to create its storage from the parameter
197 aStorage = factory->Create(param);
199 PutActiveStorage(param->CloneParam(), aStorage);
200 aStorage->SetURI(param->GetURI());
202 if(aStorage->GetType() == "alien"){
203 aStorage->QueryCDB(fRun);
206 "Skipping query for valid files, it is used only in grid...");
213 AliError(Form("Failed to activate requested storage! Check URI: %s", param->GetURI().Data()));
218 //_____________________________________________________________________________
219 AliCDBStorage* AliCDBManager::GetActiveStorage(const AliCDBParam* param) {
220 // get a storage object from the list of active storages
222 return dynamic_cast<AliCDBStorage*> (fActiveStorages.GetValue(param));
225 //_____________________________________________________________________________
226 TList* AliCDBManager::GetActiveStorages() {
227 // return list of active storages
228 // user has responsibility to delete returned object
230 TList* result = new TList();
232 TIter iter(fActiveStorages.GetTable());
234 while ((aPair = (TPair*) iter.Next())) {
235 result->Add(aPair->Value());
241 //_____________________________________________________________________________
242 void AliCDBManager::SetDrain(const char* dbString) {
243 // set drain storage from URI string
245 fDrainStorage = GetStorage(dbString);
248 //_____________________________________________________________________________
249 void AliCDBManager::SetDrain(const AliCDBParam* param) {
250 // set drain storage from AliCDBParam
252 fDrainStorage = GetStorage(param);
255 //_____________________________________________________________________________
256 void AliCDBManager::SetDrain(AliCDBStorage* storage) {
257 // set drain storage from another active storage
259 fDrainStorage = storage;
262 //_____________________________________________________________________________
263 Bool_t AliCDBManager::Drain(AliCDBEntry *entry) {
264 // drain retrieved object to drain storage
266 AliDebug(2, "Draining into drain storage...");
267 return fDrainStorage->Put(entry);
270 //_____________________________________________________________________________
271 void AliCDBManager::SetDefaultStorage(const char* dbString) {
272 // sets default storage from URI string
274 AliInfo(Form("Setting Default storage to: %s",dbString));
275 fDefaultStorage = GetStorage(dbString);
278 //_____________________________________________________________________________
279 void AliCDBManager::SetDefaultStorage(const AliCDBParam* param) {
280 // set default storage from AliCDBParam object
282 fDefaultStorage = GetStorage(param);
285 //_____________________________________________________________________________
286 void AliCDBManager::SetDefaultStorage(AliCDBStorage* storage) {
287 // set default storage from another active storage
289 fDefaultStorage = storage;
292 //_____________________________________________________________________________
293 void AliCDBManager::SetSpecificStorage(const char* calibType, const char* dbString) {
294 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
296 AliCDBParam *aPar = CreateParameter(dbString);
298 SetSpecificStorage(calibType, aPar);
302 //_____________________________________________________________________________
303 void AliCDBManager::SetSpecificStorage(const char* calibType, AliCDBParam* param) {
304 // sets storage specific for detector or calibration type (works with AliCDBManager::Get(...))
305 // Default storage should be defined prior to any specific storages, e.g.:
306 // AliCDBManager::instance()->SetDefaultStorage("alien://");
307 // AliCDBManager::instance()->SetSpecificStorage("TPC/*","local://DB_TPC");
308 // AliCDBManager::instance()->SetSpecificStorage("*/Align/*","local://DB_TPCAlign");
309 // calibType must be a valid CDB path! (3 level folder structure)
311 if(!fDefaultStorage) {
312 AliError("Please activate a default storage first!");
316 AliCDBPath aPath(calibType);
317 if(!aPath.IsValid()){
318 AliError(Form("Not a valid path: %s", calibType));
322 TObjString *objCalibType = new TObjString(aPath.GetPath());
323 if(fSpecificStorages.Contains(objCalibType)){
324 AliWarning(Form("Storage \"%s\" already activated! It will be replaced by the new one",
326 AliCDBParam *checkPar = dynamic_cast<AliCDBParam*> (fSpecificStorages.GetValue(calibType));
327 if(checkPar) delete checkPar;
328 delete fSpecificStorages.Remove(objCalibType);
332 fSpecificStorages.Add(objCalibType, param->CloneParam());
335 //_____________________________________________________________________________
336 AliCDBStorage* AliCDBManager::GetSpecificStorage(const char* calibType) {
337 // get storage specific for detector or calibration type
339 AliCDBPath calibPath(calibType);
340 if(!calibPath.IsValid()) return NULL;
342 AliCDBParam *checkPar = (AliCDBParam*) fSpecificStorages.GetValue(calibPath.GetPath());
344 AliError(Form("%s storage not found!", calibType));
347 return GetStorage(checkPar);
352 //_____________________________________________________________________________
353 AliCDBParam* AliCDBManager::SelectSpecificStorage(const TString& path) {
354 // select storage valid for path from the list of specific storages
356 AliCDBPath aPath(path);
357 if(!aPath.IsValid()) return NULL;
359 TIter iter(&fSpecificStorages);
360 TObjString *aCalibType=0;
361 AliCDBPath tmpPath("null/null/null");
363 while((aCalibType = (TObjString*) iter.Next())){
364 AliCDBPath calibTypePath(aCalibType->GetName());
365 if(calibTypePath.Comprises(aPath)) {
366 if(calibTypePath.Comprises(tmpPath)) continue;
367 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
368 tmpPath.SetPath(calibTypePath.GetPath());
374 //_____________________________________________________________________________
375 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path, Int_t runNumber,
376 Int_t version, Int_t subVersion) {
377 // get an AliCDBEntry object from the database
380 // RunNumber is not specified. Try with fRun
382 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
388 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
391 //_____________________________________________________________________________
392 AliCDBEntry* AliCDBManager::Get(const AliCDBPath& path,
393 const AliCDBRunRange& runRange, Int_t version,
395 // get an AliCDBEntry object from the database!
397 return Get(AliCDBId(path, runRange, version, subVersion));
400 //_____________________________________________________________________________
401 AliCDBEntry* AliCDBManager::Get(const AliCDBId& query) {
402 // get an AliCDBEntry object from the database
404 if(!fDefaultStorage) {
405 AliError("No storage set!");
409 // check if query's path and runRange are valid
410 // query is invalid also if version is not specified and subversion is!
411 if (!query.IsValid()) {
412 AliError(Form("Invalid query: %s", query.ToString().Data()));
416 // query is not specified if path contains wildcard or run range= [-1,-1]
417 if (!query.IsSpecified()) {
418 AliError(Form("Unspecified query: %s",
419 query.ToString().Data()));
423 if(fCache && query.GetFirstRun() != fRun)
424 AliWarning("Run number explicitly set in query: CDB cache temporarily disabled!");
427 AliCDBEntry *entry=0;
429 // first look into map of cached objects
430 if(fCache && query.GetFirstRun() == fRun)
431 entry = (AliCDBEntry*) fEntryCache.GetValue(query.GetPath());
434 AliDebug(2, Form("Object %s retrieved from cache !!",query.GetPath().Data()));
438 // Entry is not in cache -> retrieve it from CDB and cache it!!
439 AliCDBStorage *aStorage=0;
440 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
443 aStorage=GetStorage(aPar);
444 TString str = aPar->GetURI();
445 AliDebug(2,Form("Looking into storage: %s",str.Data()));
448 aStorage=GetDefaultStorage();
449 AliDebug(2,"Looking into default storage");
452 entry = aStorage->Get(query);
453 if (!entry) return NULL;
455 if(fCache && (query.GetFirstRun() == fRun)){
456 CacheEntry(query.GetPath(), entry);
463 //_____________________________________________________________________________
464 TList* AliCDBManager::GetAll(const AliCDBPath& path, Int_t runNumber,
465 Int_t version, Int_t subVersion) {
466 // get multiple AliCDBEntry objects from the database
469 // RunNumber is not specified. Try with fRun
471 AliError("Run number neither specified in query nor set in AliCDBManager! Use AliCDBManager::SetRun.");
477 return GetAll(AliCDBId(path, runNumber, runNumber, version,
481 //_____________________________________________________________________________
482 TList* AliCDBManager::GetAll(const AliCDBPath& path,
483 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
484 // get multiple AliCDBEntry objects from the database
486 return GetAll(AliCDBId(path, runRange, version, subVersion));
489 //_____________________________________________________________________________
490 TList* AliCDBManager::GetAll(const AliCDBId& query) {
491 // get multiple AliCDBEntry objects from the database
492 // Warning: this method works correctly only for queries of the type "Detector/*"
493 // and not for more specific queries e.g. "Detector/Calib/*" !
494 // Warning #2: Entries are cached, but GetAll will keep on retrieving objects from OCDB!
495 // To get an object from cache use Get() function
497 if(!fDefaultStorage) {
498 AliError("No storage set!");
502 if (!query.IsValid()) {
503 AliError(Form("Invalid query: %s", query.ToString().Data()));
507 if((fSpecificStorages.GetEntries()>0) && query.GetPath().BeginsWith('*')){
508 // if specific storages are active a query with "*" is ambiguous
509 AliError("Query too generic in this context!");
513 if (query.IsAnyRange()) {
514 AliError(Form("Unspecified run or runrange: %s",
515 query.ToString().Data()));
519 AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
521 AliCDBStorage *aStorage;
523 aStorage=GetStorage(aPar);
524 AliDebug(2,Form("Looking into storage: %s", aPar->GetURI().Data()));
527 aStorage=GetDefaultStorage();
528 AliDebug(2,"Looking into default storage");
532 if(aStorage) result = aStorage->GetAll(query);
533 if(!result) return 0;
535 // loop on result to check whether entries should be re-queried with specific storages
536 if(fSpecificStorages.GetEntries()>0 && ! (fSpecificStorages.GetEntries() == 1 && aPar)) {
537 AliInfo("Now look into all other specific storages...");
540 AliCDBEntry* chkEntry=0;
542 while((chkEntry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
543 AliCDBId& chkId = chkEntry->GetId();
544 AliDebug(2, Form("Checking id %s ", chkId.GetPath().Data()));
545 AliCDBParam *chkPar=SelectSpecificStorage(chkId.GetPath());
546 if (!chkPar || aPar == chkPar) continue;
547 AliCDBStorage *chkStorage = GetStorage(chkPar);
548 AliDebug(2, Form("Found specific storage! %s", chkPar->GetURI().Data()));
550 AliCDBEntry *newEntry=0;
551 chkId.SetRunRange(query.GetFirstRun(), query.GetLastRun());
552 chkId.SetVersion(query.GetVersion());
553 chkId.SetSubVersion(query.GetSubVersion());
555 if(chkStorage) newEntry = chkStorage->Get(chkId);
556 if(!newEntry) continue;
558 // object is found in specific storage: replace entry in the result list!
559 chkEntry->SetOwner(1);
560 delete result->Remove(chkEntry);
561 result->AddFirst(newEntry);
564 Int_t nEntries = result->GetEntries();
565 AliInfo("After look into other specific storages, result list is:");
566 for(int i=0; i<nEntries;i++){
567 AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
568 AliInfo(Form("%s",entry->GetId().ToString().Data()));
573 if(fCache && (query.GetFirstRun() == fRun)){
576 AliCDBEntry* entry=0;
577 while((entry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
578 CacheEntry(entry->GetId().GetPath(), entry);
585 //_____________________________________________________________________________
586 Bool_t AliCDBManager::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData, DataType type){
587 // store an AliCDBEntry object into the database
589 AliCDBEntry anEntry(object, id, metaData);
590 return Put(&anEntry, type);
595 //_____________________________________________________________________________
596 Bool_t AliCDBManager::Put(AliCDBEntry* entry, DataType type){
597 // store an AliCDBEntry object into the database
599 if(type == kPrivate && !fDefaultStorage) {
600 AliError("No storage set!");
605 AliError("No entry!");
609 if (!entry->GetId().IsValid()) {
610 AliError(Form("Invalid entry ID: %s",
611 entry->GetId().ToString().Data()));
615 if (!entry->GetId().IsSpecified()) {
616 AliError(Form("Unspecified entry ID: %s",
617 entry->GetId().ToString().Data()));
621 AliCDBId id = entry->GetId();
622 AliCDBParam *aPar = SelectSpecificStorage(id.GetPath());
624 AliCDBStorage *aStorage=0;
627 aStorage=GetStorage(aPar);
631 aStorage = GetStorage(fCondParam);
634 aStorage = GetStorage(fRefParam);
637 aStorage = GetDefaultStorage();
642 AliDebug(2,Form("Storing object into storage: %s", aStorage->GetURI().Data()));
644 Bool_t result = aStorage->Put(entry, type);
646 if(fRun >= 0) QueryCDB();
653 //_____________________________________________________________________________
654 void AliCDBManager::CacheEntry(const char* path, AliCDBEntry* entry)
656 // cache AliCDBEntry. Cache is valid until run number is changed.
658 AliCDBEntry *chkEntry = dynamic_cast<AliCDBEntry*> (fEntryCache.GetValue(path));
661 AliDebug(2, Form("Object %s already in cache !!", path));
664 AliDebug(2,Form("Caching entry %s", path));
667 fEntryCache.Add(new TObjString(path), entry);
668 AliDebug(2,Form("Cache entries: %d", fEntryCache.GetEntries()));
672 //_____________________________________________________________________________
673 void AliCDBManager::Print(Option_t* /*option*/) const
675 // Print list of active storages and their URIs
677 TString output=Form("Run number = %d; ",fRun);
678 output += "Cache is ";
679 if(!fCache) output += "NOT ";
680 output += Form("ACTIVE; Number of active storages: %d\n",fActiveStorages.GetEntries());
682 if(fDefaultStorage) {
683 output += Form("\t*** Default Storage URI: \"%s\"\n",fDefaultStorage->GetURI().Data());
684 // AliInfo(output.Data());
686 if(fSpecificStorages.GetEntries()>0) {
687 TIter iter(fSpecificStorages.GetTable());
690 while((aPair = (TPair*) iter.Next())){
691 output += Form("\t*** Specific storage %d: Path \"%s\" -> URI \"%s\"\n",
692 i++, ((TObjString*) aPair->Key())->GetName(),
693 ((AliCDBParam*) aPair->Value())->GetURI().Data());
697 output += Form("*** Drain Storage URI: %s\n",fDrainStorage->GetURI().Data());
699 AliInfo(output.Data());
702 //_____________________________________________________________________________
703 void AliCDBManager::SetRun(Int_t run)
705 // Sets current run number.
706 // When the run number changes the caching is cleared.
716 //_____________________________________________________________________________
717 void AliCDBManager::ClearCache(){
718 // clear AliCDBEntry cache
720 AliDebug(2,Form("Clearing cache!"));
721 fEntryCache.DeleteAll();
722 AliDebug(2,Form("Cache entries: %d",fEntryCache.GetEntries()));
726 //_____________________________________________________________________________
727 void AliCDBManager::UnloadFromCache(const char* path){
728 // unload cached object
730 AliCDBPath queryPath(path);
731 if(!queryPath.IsValid()) return;
733 if(!queryPath.IsWildcard()) { // path is not wildcard, get it directly from the cache and unload it!
734 if(fEntryCache.Contains(path)){
735 AliInfo(Form("Unloading object \"%s\" from cache", path));
736 TObjString pathStr(path);
737 AliCDBEntry *entry = dynamic_cast<AliCDBEntry*> (fEntryCache.GetValue(&pathStr));
738 if(entry) delete entry;
739 delete fEntryCache.Remove(&pathStr);
741 AliError(Form("Cache does not contain object \"%s\"!", path))
743 AliDebug(2,Form("Cache entries: %d",fEntryCache.GetEntries()));
747 // path is wildcard: loop on the cache and unload all comprised objects!
748 TIter iter(fEntryCache.GetTable());
751 while((pair = dynamic_cast<TPair*> (iter.Next()))){
752 AliCDBPath entryPath = pair->Key()->GetName();
753 if(queryPath.Comprises(entryPath)) {
754 AliInfo(Form("Unloading object \"%s\" from cache", entryPath.GetPath().Data()));
755 TObjString pathStr(entryPath.GetPath().Data());
756 AliCDBEntry *entry = dynamic_cast<AliCDBEntry*> (fEntryCache.GetValue(&pathStr));
757 if(entry) delete entry;
758 delete fEntryCache.Remove(&pathStr);
761 AliDebug(2,Form("Cache entries: %d",fEntryCache.GetEntries()));
764 //_____________________________________________________________________________
765 void AliCDBManager::DestroyActiveStorages() {
766 // delete list of active storages
768 fActiveStorages.DeleteAll();
769 fSpecificStorages.DeleteAll();
772 //_____________________________________________________________________________
773 void AliCDBManager::DestroyActiveStorage(AliCDBStorage* /*storage*/) {
774 // destroys active storage
777 TIter iter(fActiveStorages.GetTable());
779 while ((aPair = (TPair*) iter.Next())) {
780 if(storage == (AliCDBStorage*) aPair->Value())
781 delete fActiveStorages.Remove(aPair->Key());
782 storage->Delete(); storage=0x0;
788 //_____________________________________________________________________________
789 void AliCDBManager::QueryCDB() {
790 // query default and specific storages for files valid for fRun. Every storage loads the Ids into its list.
793 AliError("Run number not yet set! Use AliCDBManager::SetRun.");
796 if (!fDefaultStorage){
797 AliError("Default storage is not set! Use AliCDBManager::SetDefaultStorage");
800 if(fDefaultStorage->GetType() == "alien"){
801 fDefaultStorage->QueryCDB(fRun);
803 AliDebug(2,"Skipping query for valid files, it used only in grid...");
806 TIter iter(&fSpecificStorages);
807 TObjString *aCalibType=0;
809 while((aCalibType = dynamic_cast<TObjString*> (iter.Next()))){
810 aPar = (AliCDBParam*) fSpecificStorages.GetValue(aCalibType);
812 AliDebug(2,Form("Querying specific storage %s",aCalibType->GetName()));
813 AliCDBStorage *aStorage = GetStorage(aPar);
814 if(aStorage->GetType() == "alien"){
815 aStorage->QueryCDB(fRun,aCalibType->GetName());
818 "Skipping query for valid files, it is used only in grid...");
824 //______________________________________________________________________________________________
825 const char* AliCDBManager::GetDataTypeName(DataType type)
827 // returns the name (string) of the data type
830 case kCondition: return "Conditions";
831 case kReference: return "Reference";
832 case kPrivate: return "Private";
838 ///////////////////////////////////////////////////////////
839 // AliCDBManager Parameter class //
840 // interface to specific AliCDBParameter class //
841 // (AliCDBGridParam, AliCDBLocalParam, AliCDBDumpParam) //
842 ///////////////////////////////////////////////////////////
844 AliCDBParam::AliCDBParam():
852 //_____________________________________________________________________________
853 AliCDBParam::~AliCDBParam() {