]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliCDBDump.cxx
Fix Coverity 15062, 15063
[u/mrichter/AliRoot.git] / STEER / AliCDBDump.cxx
index 3bd1d765ea624252e3eb60126818e4ad698d4938..512aece1ae8ba437360a803f6dd5ec3c916fa5de 100644 (file)
@@ -20,6 +20,7 @@
 //                                                                 //
 /////////////////////////////////////////////////////////////////////
 
+#include <cstdlib>
 #include <TSystem.h>
 #include <TKey.h>
 #include <TFile.h>
@@ -46,6 +47,9 @@ fFile(NULL), fReadOnly(readOnly) {
                AliDebug(2,Form("File <%s> opened",dbFile));
                if(fReadOnly) AliDebug(2,Form("in read-only mode"));
        }
+
+       fType="dump";
+       fBaseFolder = dbFile;
 }
 
 //_____________________________________________________________________________
@@ -108,7 +112,7 @@ Bool_t AliCDBDump::IdToKeyName(const AliCDBRunRange& runRange, Int_t version,
         }
 
        if (subVersion < 0) {
-               AliDebug(2,Form("Invalid subversion <%s>.", subVersion));
+               AliDebug(2,Form("Invalid subversion <%d>.", subVersion));
                return kFALSE;
        }
     
@@ -233,9 +237,9 @@ Bool_t AliCDBDump::PrepareId(AliCDBId& id) {
 
        if(lastStorage.Contains(TString("new"), TString::kIgnoreCase) &&
           id.GetSubVersion() > 0 ){
-               AliWarning(Form("A NEW object is being stored with version v%d_s%d",
+               AliDebug(2, Form("A NEW object is being stored with version v%d_s%d",
                                        id.GetVersion(),id.GetSubVersion()));
-               AliWarning(Form("and it will hide previously stored object with v%d_s%d!",
+               AliDebug(2, Form("and it will hide previously stored object with v%d_s%d!",
                                        id.GetVersion(),id.GetSubVersion()-1));
        }
 
@@ -248,12 +252,121 @@ Bool_t AliCDBDump::PrepareId(AliCDBId& id) {
 
 }
 
+// //_____________________________________________________________________________
+// Bool_t AliCDBDump::GetId(const AliCDBId& query, AliCDBId& result) {
+// // look for filename matching query (called by GetEntry)
+// 
+// 
+//         AliCDBRunRange aRunRange; // the runRange got from filename
+//         Int_t aVersion, aSubVersion; // the version and subVersion got from filename
+// 
+//     TIter iter(gDirectory->GetListOfKeys());
+//     TKey* key;
+// 
+//     if (!query.HasVersion()) { // neither version and subversion specified -> look for highest version and subVersion
+// 
+//                 while ((key = (TKey*) iter.Next())) { // loop on the keys
+// 
+//                     if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
+//                         // aRunRange, aVersion, aSubVersion filled from filename
+// 
+//                     if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
+//                     // aRunRange contains requested run!
+// 
+//                     if (result.GetVersion() < aVersion) {
+//                             result.SetVersion(aVersion);
+//                             result.SetSubVersion(aSubVersion);
+// 
+//                             result.SetFirstRun(
+//                                     aRunRange.GetFirstRun());
+//                             result.SetLastRun(
+//                                     aRunRange.GetLastRun());
+// 
+//                     } else if (result.GetVersion() == aVersion
+//                             && result.GetSubVersion()
+//                                     < aSubVersion) {
+// 
+//                             result.SetSubVersion(aSubVersion);
+// 
+//                             result.SetFirstRun(
+//                                     aRunRange.GetFirstRun());
+//                             result.SetLastRun(
+//                                     aRunRange.GetLastRun());
+//                     } else if (result.GetVersion() == aVersion
+//                             && result.GetSubVersion() == aSubVersion){
+//                                     AliDebug(2,Form("More than one object valid for run %d, version %d_%d!",
+//                                     query.GetFirstRun(), aVersion, aSubVersion));
+//                             result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
+//                             return kFALSE;
+//                             }
+//             }
+// 
+//     } else if (!query.HasSubVersion()) { // version specified but not subversion -> look for highest subVersion
+// 
+//             result.SetVersion(query.GetVersion());
+// 
+//                 while ((key = (TKey*) iter.Next())) { // loop on the keys
+// 
+//                     if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
+//                         // aRunRange, aVersion, aSubVersion filled from filename
+// 
+//                        if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
+//                     // aRunRange contains requested run!
+//                     
+//                     if(query.GetVersion() != aVersion) continue;
+//                     // aVersion is requested version!
+// 
+//                     if(result.GetSubVersion() == aSubVersion){
+//                                     AliDebug(2,Form("More than one object valid for run %d, version %d_%d!",
+//                                     query.GetFirstRun(), aVersion, aSubVersion));
+//                             result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
+//                             return kFALSE;
+//                     }
+//                     if( result.GetSubVersion() < aSubVersion) {
+// 
+//                                 result.SetSubVersion(aSubVersion);
+// 
+//                                 result.SetFirstRun(
+//                                     aRunRange.GetFirstRun());
+//                                 result.SetLastRun(
+//                                     aRunRange.GetLastRun());
+//                     }
+//                 }
+// 
+//     } else { // both version and subversion specified
+// 
+//                 while ((key = (TKey*) iter.Next())) { // loop on the keys
+// 
+//                     if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
+//                         // aRunRange, aVersion, aSubVersion filled from filename
+// 
+//                     if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
+//                     // aRunRange contains requested run!
+// 
+//                     if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue;
+//                     // aVersion and aSubVersion are requested version and subVersion!
+// 
+//                     if(result.GetVersion() == aVersion && result.GetSubVersion() == aSubVersion){
+//                                     AliDebug(2,Form("More than one object valid for run %d, version %d_%d!",
+//                                     query.GetFirstRun(), aVersion, aSubVersion));
+//                             result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
+//                             return kFALSE; 
+//                     }
+//                     result.SetVersion(aVersion);
+//                     result.SetSubVersion(aSubVersion);
+//                     result.SetFirstRun(aRunRange.GetFirstRun());
+//                     result.SetLastRun(aRunRange.GetLastRun());
+// 
+//             }
+//     }
+// 
+//     return kTRUE;
+// }
 
 //_____________________________________________________________________________
-AliCDBId AliCDBDump::GetId(const AliCDBId& query) {
+AliCDBId* AliCDBDump::GetId(const AliCDBId& query) {
 // look for filename matching query (called by GetEntry)
 
-        AliCDBId result(query.GetAliCDBPath(), -1, -1, -1, -1);
 
         AliCDBRunRange aRunRange; // the runRange got from filename
         Int_t aVersion, aSubVersion; // the version and subVersion got from filename
@@ -261,8 +374,11 @@ AliCDBId AliCDBDump::GetId(const AliCDBId& query) {
        TIter iter(gDirectory->GetListOfKeys());
        TKey* key;
 
+       AliCDBId* result = new AliCDBId();
+       result->SetPath(query.GetPath());
+
        if (!query.HasVersion()) { // neither version and subversion specified -> look for highest version and subVersion
-               
+
                 while ((key = (TKey*) iter.Next())) { // loop on the keys
                        
                        if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
@@ -270,41 +386,41 @@ AliCDBId AliCDBDump::GetId(const AliCDBId& query) {
 
                        if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
                        // aRunRange contains requested run!
-                       
-                       if (result.GetVersion() < aVersion) {
-                               result.SetVersion(aVersion);
-                               result.SetSubVersion(aSubVersion);
 
-                               result.SetFirstRun(
+                       if (result->GetVersion() < aVersion) {
+                               result->SetVersion(aVersion);
+                               result->SetSubVersion(aSubVersion);
+
+                               result->SetFirstRun(
                                        aRunRange.GetFirstRun());
-                               result.SetLastRun(
+                               result->SetLastRun(
                                        aRunRange.GetLastRun());
 
-                       } else if (result.GetVersion() == aVersion 
-                               && result.GetSubVersion() 
+                       } else if (result->GetVersion() == aVersion
+                               && result->GetSubVersion()
                                        < aSubVersion) {
 
-                               result.SetSubVersion(aSubVersion);
+                               result->SetSubVersion(aSubVersion);
 
-                               result.SetFirstRun(
+                               result->SetFirstRun(
                                        aRunRange.GetFirstRun());
-                               result.SetLastRun(
+                               result->SetLastRun(
                                        aRunRange.GetLastRun());
-                       } else if (result.GetVersion() == aVersion
-                               && result.GetSubVersion() == aSubVersion){
-                               AliError(Form("More than one object valid for run %d, version %d_%d!", 
+                       } else if (result->GetVersion() == aVersion
+                               && result->GetSubVersion() == aSubVersion){
+                               AliError(Form("More than one object valid for run %d, version %d_%d!",
                                        query.GetFirstRun(), aVersion, aSubVersion));
-                               result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
-                               return result; 
+                               delete result;
+                               return NULL;
                                }
                }
-               
+
        } else if (!query.HasSubVersion()) { // version specified but not subversion -> look for highest subVersion
 
-               result.SetVersion(query.GetVersion());
+               result->SetVersion(query.GetVersion());
 
                 while ((key = (TKey*) iter.Next())) { // loop on the keys
-                       
+
                        if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
                         // aRunRange, aVersion, aSubVersion filled from filename
 
@@ -313,20 +429,20 @@ AliCDBId AliCDBDump::GetId(const AliCDBId& query) {
                        
                        if(query.GetVersion() != aVersion) continue;
                        // aVersion is requested version!
-                       
-                       if(result.GetSubVersion() == aSubVersion){
-                               AliError(Form("More than one object valid for run %d, version %d_%d!", 
+
+                       if(result->GetSubVersion() == aSubVersion){
+                               AliError(Form("More than one object valid for run %d, version %d_%d!",
                                        query.GetFirstRun(), aVersion, aSubVersion));
-                               result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
-                               return result; 
+                               delete result;
+                               return NULL;
                        }
-                       if( result.GetSubVersion() < aSubVersion) {
+                       if( result->GetSubVersion() < aSubVersion) {
 
-                                result.SetSubVersion(aSubVersion);
+                                result->SetSubVersion(aSubVersion);
 
-                                result.SetFirstRun(
+                                result->SetFirstRun(
                                        aRunRange.GetFirstRun());
-                                result.SetLastRun(
+                                result->SetLastRun(
                                        aRunRange.GetLastRun());
                        } 
                 }
@@ -337,23 +453,23 @@ AliCDBId AliCDBDump::GetId(const AliCDBId& query) {
                        
                        if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
                         // aRunRange, aVersion, aSubVersion filled from filename
-                       
+
                        if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
                        // aRunRange contains requested run!
 
-                       if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue; 
+                       if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue;
                        // aVersion and aSubVersion are requested version and subVersion!
 
-                       if(result.GetVersion() == aVersion && result.GetSubVersion() == aSubVersion){
-                               AliError(Form("More than one object valid for run %d, version %d_%d!", 
+                       if(result->GetVersion() == aVersion && result->GetSubVersion() == aSubVersion){
+                               AliError(Form("More than one object valid for run %d, version %d_%d!",
                                        query.GetFirstRun(), aVersion, aSubVersion));
-                               result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
-                               return result; 
+                               delete result;
+                               return NULL;
                        }
-                       result.SetVersion(aVersion);
-                       result.SetSubVersion(aSubVersion);
-                       result.SetFirstRun(aRunRange.GetFirstRun());
-                       result.SetLastRun(aRunRange.GetLastRun());
+                       result->SetVersion(aVersion);
+                       result->SetSubVersion(aSubVersion);
+                       result->SetFirstRun(aRunRange.GetFirstRun());
+                       result->SetLastRun(aRunRange.GetLastRun());
                        
                }
        }
@@ -362,7 +478,7 @@ AliCDBId AliCDBDump::GetId(const AliCDBId& query) {
 }
 
 //_____________________________________________________________________________
-AliCDBEntry* AliCDBDump::GetEntry(const AliCDBId& query) {
+AliCDBEntry* AliCDBDump::GetEntry(const AliCDBId& queryId) {
 // get AliCDBEntry from the database
 
        TDirectory::TContext context(gDirectory, fFile);
@@ -372,51 +488,83 @@ AliCDBEntry* AliCDBDump::GetEntry(const AliCDBId& query) {
                 return NULL;
         }
 
-        if (!gDirectory->cd(query.GetPath())) {
+        if (!gDirectory->cd(queryId.GetPath())) {
                 return NULL;
         }
 
-       AliCDBId dataId;
-
-       // look for a filename matching query requests (path, runRange, version, subVersion)
-       if (!query.HasVersion()) {
-               // if version is not specified, first check the selection criteria list
-               dataId = GetId(GetSelection(query));
-       } else {
-               dataId = GetId(query);
-       }
+       AliCDBId *dataId = GetEntryId(queryId);
 
-       if (!dataId.IsSpecified()) {
+       if (!dataId || !dataId->IsSpecified()) {
+               if(dataId) delete dataId;
                return NULL;
        }
-       
+
        TString keyname;
-       if (!IdToKeyName(dataId.GetAliCDBRunRange(), dataId.GetVersion(), 
-               dataId.GetSubVersion(), keyname)) {
-               AliError("Bad ID encountered! Subnormal error!");
+       if (!IdToKeyName(dataId->GetAliCDBRunRange(), dataId->GetVersion(),
+               dataId->GetSubVersion(), keyname)) {
+               AliDebug(2,Form("Bad ID encountered! Subnormal error!"));
+               delete dataId;
                return NULL;
        }
 
        // get the only AliCDBEntry object from the file
-       // the object in the file is an AliCDBEntry entry named keyname 
+       // the object in the file is an AliCDBEntry entry named keyname
        // keyName = Run#firstRun_#lastRun_v#version_s#subVersion
 
        TObject* anObject = gDirectory->Get(keyname);
        if (!anObject) {
-               AliError("Bad storage data: NULL entry object!");
+               AliDebug(2,Form("Bad storage data: NULL entry object!"));
+               delete dataId;
                return NULL;
        } 
 
        if (AliCDBEntry::Class() != anObject->IsA()) {
-               AliError("Bad storage data: Invalid entry object!");
+               AliDebug(2,Form("Bad storage data: Invalid entry object!"));
+               delete dataId;
                return NULL;
        }
 
        ((AliCDBEntry*) anObject)->SetLastStorage("dump");
-       
+
+       delete dataId;
        return (AliCDBEntry*) anObject;
 }
 
+//_____________________________________________________________________________
+AliCDBId* AliCDBDump::GetEntryId(const AliCDBId& queryId) {
+// get AliCDBEntry from the database
+
+       TDirectory::TContext context(gDirectory, fFile);
+
+       if (!(fFile && fFile->IsOpen())) {
+                AliError("AliCDBDump storage is not initialized properly");
+                return NULL;
+        }
+
+        if (!gDirectory->cd(queryId.GetPath())) {
+                return NULL;
+        }
+
+       AliCDBId* dataId = 0;
+
+       // look for a filename matching query requests (path, runRange, version, subVersion)
+       if (!queryId.HasVersion()) {
+               // if version is not specified, first check the selection criteria list
+               AliCDBId selectedId(queryId);
+               GetSelection(&selectedId);
+               dataId = GetId(queryId);
+       } else {
+               dataId = GetId(queryId);
+       }
+
+       if (dataId && !dataId->IsSpecified()) {
+               delete dataId;
+               return NULL;
+       }
+
+       return dataId;
+}
+
 //_____________________________________________________________________________
 void AliCDBDump::GetEntriesForLevel0(const AliCDBId& queryId, TList* result) {
 // multiple request (AliCDBStorage::GetAll)
@@ -427,7 +575,7 @@ void AliCDBDump::GetEntriesForLevel0(const AliCDBId& queryId, TList* result) {
        TKey* key;
 
        while ((key = (TKey*) iter.Next())) {
-               
+
                TString keyNameStr(key->GetName());
                if (queryId.GetAliCDBPath().Level1Comprises(keyNameStr)) {
                        gDirectory->cd(keyNameStr);
@@ -540,7 +688,7 @@ Bool_t AliCDBDump::PutEntry(AliCDBEntry* entry) {
        // write object (key name: Run#firstRun_#lastRun_v#version_s#subVersion)
        Bool_t result = gDirectory->WriteTObject(entry, keyname);
        if (!result) {
-               AliError(Form("Can't write entry to file: %s", 
+               AliError(Form("Can't write entry to file: %s",
                                fFile->GetName()));
        }
 
@@ -598,6 +746,66 @@ Bool_t AliCDBDump::Contains(const char* path) const{
 
 }
 
+//_____________________________________________________________________________
+void AliCDBDump::QueryValidFiles()
+{
+// Query the CDB for files valid for AliCDBStorage::fRun
+// fills list fValidFileIds with AliCDBId objects created from file name
+
+       AliError("Not yet (and maybe never) implemented");
+}
+
+//_____________________________________________________________________________
+Bool_t AliCDBDump::IdToFilename(const AliCDBId& /*id*/, TString& /*filename*/) const {
+// build file name from AliCDBId (path, run range, version) and fDBFolder
+
+       AliError("Not implemented");
+        return kFALSE;
+}
+
+//_____________________________________________________________________________
+Int_t AliCDBDump::GetLatestVersion(const char* path, Int_t run){
+// get last version found in the database valid for run and path
+
+       AliCDBPath aCDBPath(path);
+       if(!aCDBPath.IsValid() || aCDBPath.IsWildcard()) {
+               AliError(Form("Invalid path in request: %s", path));
+               return -1;
+       }
+
+       AliCDBId query(path, run, run, -1, -1);
+       AliCDBId *dataId = GetId(query);
+
+       if(!dataId) return -1;
+       Int_t version = dataId->GetVersion();
+
+       delete dataId;
+       return version;
+}
+
+//_____________________________________________________________________________
+Int_t AliCDBDump::GetLatestSubVersion(const char* path, Int_t run, Int_t version){
+// get last version found in the database valid for run and path
+
+       AliCDBPath aCDBPath(path);
+       if(!aCDBPath.IsValid() || aCDBPath.IsWildcard()) {
+               AliError(Form("Invalid path in request: %s", path));
+               return -1;
+       }
+
+       AliCDBId query(path, run, run, version, -1);
+       AliCDBId *dataId = GetId(query);
+
+       if(!dataId) return -1;
+
+       Int_t subVersion = dataId->GetSubVersion();
+
+       delete dataId;
+       return subVersion;
+
+}
+
+
 /////////////////////////////////////////////////////////////////////////////////////////////////
 //                                                                                             //
 // AliCDBDump factory                                                                                 //
@@ -652,7 +860,7 @@ AliCDBStorage* AliCDBDumpFactory::Create(const AliCDBParam* param) {
                 const AliCDBDumpParam* dumpParam = 
                        (const AliCDBDumpParam*) param;
 
-                return new AliCDBDump(dumpParam->GetPath(), 
+                return new AliCDBDump(dumpParam->GetPath(),
                                dumpParam->IsReadOnly());
         }
 
@@ -668,7 +876,9 @@ AliCDBStorage* AliCDBDumpFactory::Create(const AliCDBParam* param) {
 ClassImp(AliCDBDumpParam)
 
 //_____________________________________________________________________________
-AliCDBDumpParam::AliCDBDumpParam() {
+AliCDBDumpParam::AliCDBDumpParam():
+fDBPath(), fReadOnly(kFALSE)
+{
 // default constructor
 
 }