]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliCDBManager.cxx
Conding violations fixed. The code is now included in libSTEER (Mikolaj)
[u/mrichter/AliRoot.git] / STEER / AliCDBManager.cxx
index e0fd144c669a1c06c293df60f512dbc9d57343d4..de58309a5e5bf499e7d9edd9bed131e73a442388 100644 (file)
@@ -82,24 +82,31 @@ void AliCDBManager::Destroy() {
 //_____________________________________________________________________________
 AliCDBManager::AliCDBManager():
   TObject(),
-  fCondParam(0),
-  fRefParam(0),
   fFactories(),
   fActiveStorages(),
   fSpecificStorages(),
+  fEntryCache(),
+  fIds(0),
+  fStorageMap(0),
+  fShortLived(0),
   fDefaultStorage(NULL),
-  fRemoteStorage(NULL),
   fDrainStorage(NULL),
-  fEntryCache(),
-  fCache(kTRUE),
+  fCondParam(0),
+  fRefParam(0),
   fRun(-1),
-  fShortLived(0)
+  fCache(kTRUE),
+  fLock(kFALSE)
 {
 // default constuctor
        fFactories.SetOwner(1);
        fActiveStorages.SetOwner(1);
        fSpecificStorages.SetOwner(1);
        fEntryCache.SetOwner(1);
+
+       fStorageMap = new TMap();
+       fStorageMap->SetOwner(1);
+       fIds = new TList();
+       fIds->SetOwner(1);
 }
 
 //_____________________________________________________________________________
@@ -110,7 +117,8 @@ AliCDBManager::~AliCDBManager() {
        fFactories.Delete();
        fDrainStorage = 0x0;
        fDefaultStorage = 0x0;
-       fRemoteStorage = 0x0;
+       delete fStorageMap; fStorageMap = 0;
+       delete fIds; fIds = 0;
        delete fCondParam;
        delete fRefParam;
        delete fShortLived; fShortLived = 0x0;
@@ -135,7 +143,7 @@ void AliCDBManager::RegisterFactory(AliCDBStorageFactory* factory) {
 
 //_____________________________________________________________________________
 Bool_t AliCDBManager::HasStorage(const char* dbString) const {
-// check if dbString is a URI valid for one of the registered factories 
+// check if dbString is a URI valid for one of the registered factories
 
        TIter iter(&fFactories);
 
@@ -168,7 +176,7 @@ AliCDBParam* AliCDBManager::CreateParameter(const char* dbString) const {
 //_____________________________________________________________________________
 AliCDBStorage* AliCDBManager::GetStorage(const char* dbString) {
 // get storage object from URI string
-       
+               
        AliCDBParam* param = CreateParameter(dbString);
        if (!param) {
                AliError(Form("Failed to activate requested storage! Check URI: %s", dbString));
@@ -184,7 +192,7 @@ AliCDBStorage* AliCDBManager::GetStorage(const char* dbString) {
 //_____________________________________________________________________________
 AliCDBStorage* AliCDBManager::GetStorage(const AliCDBParam* param) {
 // get storage object from AliCDBParam object
-
+       
        // if the list of active storages already contains
        // the requested storage, return it
        AliCDBStorage* aStorage = GetActiveStorage(param);
@@ -192,6 +200,14 @@ AliCDBStorage* AliCDBManager::GetStorage(const AliCDBParam* param) {
                return aStorage;
        }
 
+       // if lock is ON, cannot activate more storages!
+       if(fLock) {
+               if (fDefaultStorage) {
+                       AliFatal("Lock is ON, and default storage is already set: "
+                               "cannot reset it or activate more storages!");
+               }
+       }       
+       
        TIter iter(&fFactories);
 
         AliCDBStorageFactory* factory=0;
@@ -276,36 +292,63 @@ Bool_t AliCDBManager::Drain(AliCDBEntry *entry) {
 //_____________________________________________________________________________
 void AliCDBManager::SetDefaultStorage(const char* dbString) {
 // sets default storage from URI string
-
+       
        AliInfo(Form("Setting Default storage to: %s",dbString));
        AliCDBStorage* bckStorage = fDefaultStorage;
 
        fDefaultStorage = GetStorage(dbString);
+       
+       if(!fDefaultStorage) return;
 
        if(bckStorage && (fDefaultStorage != bckStorage)){
                AliWarning("Existing default storage replaced: clearing cache!");
                ClearCache();
        }
+
+       if (fStorageMap->Contains("default")) {
+               delete fStorageMap->Remove(fStorageMap->GetValue("default"));
+       }
+       fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
 }
 
 //_____________________________________________________________________________
 void AliCDBManager::SetDefaultStorage(const AliCDBParam* param) {
 // set default storage from AliCDBParam object
-
+       
        AliCDBStorage* bckStorage = fDefaultStorage;
 
        fDefaultStorage = GetStorage(param);
 
+       if(!fDefaultStorage) return;
+
        if(bckStorage && (fDefaultStorage != bckStorage)){
                AliWarning("Existing default storage replaced: clearing cache!");
                ClearCache();
        }
+
+       if (fStorageMap->Contains("default")) {
+               delete fStorageMap->Remove(fStorageMap->GetValue("default"));
+       }
+       fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
 }
 
 //_____________________________________________________________________________
 void AliCDBManager::SetDefaultStorage(AliCDBStorage* storage) {
 // set default storage from another active storage
-
+       
+       // if lock is ON, cannot activate more storages!
+       if(fLock) {
+               if (fDefaultStorage) {
+                       AliFatal("Lock is ON, and default storage is already set: "
+                               "cannot reset it or activate more storages!");
+               }
+       }       
+       
+       if (!storage) {
+               UnsetDefaultStorage();
+               return;
+       }
+       
        AliCDBStorage* bckStorage = fDefaultStorage;
 
        fDefaultStorage = storage;
@@ -314,30 +357,30 @@ void AliCDBManager::SetDefaultStorage(AliCDBStorage* storage) {
                AliWarning("Existing default storage replaced: clearing cache!");
                ClearCache();
        }
-}
-//_____________________________________________________________________________
-void AliCDBManager::SetRemoteStorage(const char* dbString) {
-// sets remote storage from URI string
-// Remote storage is queried if it is activated and if object was not found in default storage
 
-       AliInfo(Form("Setting remote storage to: %s",dbString));
-       fRemoteStorage = GetStorage(dbString);
-}
-
-//_____________________________________________________________________________
-void AliCDBManager::SetRemoteStorage(const AliCDBParam* param) {
-// set remote storage from AliCDBParam object
-// Remote storage is queried if it is activated and if object was not found in default storage
-
-       fRemoteStorage = GetStorage(param);
+       if (fStorageMap->Contains("default")) {
+               delete fStorageMap->Remove(fStorageMap->GetValue("default"));
+       }
+       fStorageMap->Add(new TObjString("default"), new TObjString(fDefaultStorage->GetURI()));
 }
 
 //_____________________________________________________________________________
-void AliCDBManager::SetRemoteStorage(AliCDBStorage* storage) {
-// set remote storage from another active storage
-// Remote storage is queried if it is activated and if object was not found in default storage
-
-       fRemoteStorage = storage;
+void AliCDBManager::UnsetDefaultStorage() {
+// Unset default storage
+       
+       // if lock is ON, action is forbidden!
+       if(fLock) {
+               if (fDefaultStorage) {
+                       AliFatal("Lock is ON: cannot unset default storage!");
+               }
+       }
+       
+       if (fDefaultStorage) {
+               AliWarning("Clearing cache!");
+               ClearCache();
+       }
+       
+       fDefaultStorage = 0x0;
 }
 
 //_____________________________________________________________________________
@@ -378,9 +421,16 @@ void AliCDBManager::SetSpecificStorage(const char* calibType, AliCDBParam* param
                if(checkPar) delete checkPar;
                delete fSpecificStorages.Remove(objCalibType);
        }
-       GetStorage(param);
+       AliCDBStorage *aStorage = GetStorage(param);
+       if(!aStorage) return;
 
        fSpecificStorages.Add(objCalibType, param->CloneParam());
+
+       if(fStorageMap->Contains(objCalibType)){
+               delete fStorageMap->Remove(objCalibType);
+       }
+       fStorageMap->Add(objCalibType->Clone(), new TObjString(param->GetURI()));
+
 }
 
 //_____________________________________________________________________________
@@ -471,10 +521,12 @@ AliCDBEntry* AliCDBManager::Get(const AliCDBId& query) {
                 return NULL;
        }
 
-       if(fCache && query.GetFirstRun() != fRun)
+       if(fLock && query.GetFirstRun() != fRun)
+               AliFatal("Lock is ON: cannot use different run number than the internal one!");
+       
+       if(fCache && query.GetFirstRun() != fRun)
                AliWarning("Run number explicitly set in query: CDB cache temporarily disabled!");
 
-
        AliCDBEntry *entry=0;
 
        // first look into map of cached objects
@@ -489,13 +541,13 @@ AliCDBEntry* AliCDBManager::Get(const AliCDBId& query) {
        // Entry is not in cache -> retrieve it from CDB and cache it!!
        AliCDBStorage *aStorage=0;
        AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
-       Bool_t usedDefStorage=kTRUE;
+//     Bool_t usedDefStorage=kTRUE;
 
        if(aPar) {
                aStorage=GetStorage(aPar);
                TString str = aPar->GetURI();
                AliDebug(2,Form("Looking into storage: %s",str.Data()));
-               usedDefStorage=kFALSE;
+//             usedDefStorage=kFALSE;
 
        } else {
                aStorage=GetDefaultStorage();
@@ -504,19 +556,37 @@ AliCDBEntry* AliCDBManager::Get(const AliCDBId& query) {
 
        entry = aStorage->Get(query);
 
-       if (!entry && usedDefStorage && IsRemoteStorageSet()) {
-               AliWarning(Form("Object not found in default storage: Looking into remote storage!"));
-               entry = fRemoteStorage->Get(query);
-       }
-
        if(entry && fCache && (query.GetFirstRun() == fRun)){
                CacheEntry(query.GetPath(), entry);
        }
 
+       if(entry && !fIds->Contains(&entry->GetId())){
+               fIds->Add(entry->GetId().Clone());
+       }
+
+
        return entry;
 
 }
 
+//_____________________________________________________________________________
+const char* AliCDBManager::GetURI(const char* path) {
+// return the URI of the storage where to look for path
+
+       if(!IsDefaultStorageSet()) return 0;
+       
+       AliCDBParam *aPar=SelectSpecificStorage(path);
+
+       if(aPar) {
+               return aPar->GetURI().Data();
+
+       } else {
+               return GetDefaultStorage()->GetURI().Data();
+       }
+       
+       return 0;
+}
+
 //_____________________________________________________________________________
 AliCDBId* AliCDBManager::GetId(const AliCDBPath& path, Int_t runNumber,
        Int_t version, Int_t subVersion) {
@@ -657,6 +727,9 @@ TList* AliCDBManager::GetAll(const AliCDBId& query) {
                return NULL;
        }
 
+       if(fLock && query.GetFirstRun() != fRun)
+               AliFatal("Lock is ON: cannot use different run number than the internal one!");
+       
        AliCDBParam *aPar=SelectSpecificStorage(query.GetPath());
 
        AliCDBStorage *aStorage;
@@ -711,15 +784,19 @@ TList* AliCDBManager::GetAll(const AliCDBId& query) {
        }
 
        // caching entries
-       if(fCache && (query.GetFirstRun() == fRun)){
+       TIter iter(result);
+       AliCDBEntry* entry=0;
+       while((entry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
 
-               TIter iter(result);
-               AliCDBEntry* entry=0;
-               while((entry = dynamic_cast<AliCDBEntry*> (iter.Next()))){
+               if(!fIds->Contains(&entry->GetId())){
+                       fIds->Add(entry->GetId().Clone());
+               }
+               if(fCache && (query.GetFirstRun() == fRun)){
                        CacheEntry(entry->GetId().GetPath(), entry);
                }
        }
 
+
        return result;
 }
 
@@ -727,6 +804,11 @@ TList* AliCDBManager::GetAll(const AliCDBId& query) {
 Bool_t AliCDBManager::Put(TObject* object, AliCDBId& id,  AliCDBMetaData* metaData, DataType type){
 // store an AliCDBEntry object into the database
 
+       if (object==0x0) {
+               AliError("Null Entry! No storage will be done!");
+               return kFALSE;
+       } 
+
        AliCDBEntry anEntry(object, id, metaData);
        return Put(&anEntry, type);
 
@@ -742,6 +824,11 @@ Bool_t AliCDBManager::Put(AliCDBEntry* entry, DataType type){
                return kFALSE;
        }
 
+       if (entry->GetObject()==0x0){
+               AliError("No valid object in CDB entry!");
+               return kFALSE;
+       }
+
        if (!entry){
                AliError("No entry!");
                return kFALSE;
@@ -845,10 +932,14 @@ void AliCDBManager::SetRun(Int_t run)
 {
 // Sets current run number.
 // When the run number changes the caching is cleared.
-  
+       
        if (fRun == run)
                return;
   
+       if(fLock && fRun >= 0) {
+               AliFatal("Lock is ON, cannot reset run number!");
+       }       
+               
        fRun = run;
        ClearCache();
        QueryCDB();
@@ -858,10 +949,23 @@ void AliCDBManager::SetRun(Int_t run)
 void AliCDBManager::ClearCache(){
 // clear AliCDBEntry cache
 
-       AliDebug(2,Form("Clearing cache!"));
+       AliDebug(2, Form("Cache entries to be deleted: %d",fEntryCache.GetEntries()));
+       
+       /*
+       // To clean entries one by one
+       TIter iter(fEntryCache.GetTable());
+       TPair* pair=0;
+       while((pair= dynamic_cast<TPair*> (iter.Next()))){
+       
+               TObjString* key = dynamic_cast<TObjString*> (pair->Key());
+               AliCDBEntry* entry = dynamic_cast<AliCDBEntry*> (pair->Value());
+               AliDebug(2, Form("Deleting entry: %s", key->GetName()));
+               if (entry) delete entry;
+               delete fEntryCache.Remove(key);
+       }
+       */
        fEntryCache.DeleteAll();
-       AliDebug(2,Form("Cache entries: %d",fEntryCache.GetEntries()));
-
+       AliDebug(2, Form("After deleting - Cache entries: %d",fEntryCache.GetEntries()));
 }
 
 //_____________________________________________________________________________
@@ -1031,6 +1135,16 @@ Bool_t AliCDBManager::IsShortLived(const char* path)
 
 }
 
+//______________________________________________________________________________________________
+void AliCDBManager::SetLock(Bool_t lock){
+
+       if(fLock == kTRUE && lock == kFALSE) {
+               AliFatal("Lock is ON: cannot reset it!");
+       }
+       
+       fLock=lock;
+}
+
 ///////////////////////////////////////////////////////////
 // AliCDBManager Parameter class                         //
 // interface to specific AliCDBParameter class           //