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 **************************************************************************/
16 /////////////////////////////////////////////////////////////////////
18 // class AliCDBDump //
19 // access class to a DataBase in a dump storage (single file) //
21 /////////////////////////////////////////////////////////////////////
28 #include <TObjString.h>
31 #include "AliCDBDump.h"
32 #include "AliCDBEntry.h"
37 //_____________________________________________________________________________
38 AliCDBDump::AliCDBDump(const char* dbFile, Bool_t readOnly):
39 fFile(NULL), fReadOnly(readOnly)
44 fFile = TFile::Open(dbFile, fReadOnly ? "READ" : "UPDATE");
46 AliError(Form("Can't open file <%s>!" , dbFile));
48 AliDebug(2,Form("File <%s> opened",dbFile));
49 if(fReadOnly) AliDebug(2,Form("in read-only mode"));
56 //_____________________________________________________________________________
57 AliCDBDump::~AliCDBDump() {
67 //_____________________________________________________________________________
68 Bool_t AliCDBDump::KeyNameToId(const char* keyname, AliCDBRunRange& runRange,
69 Int_t& version, Int_t& subVersion) {
70 // build AliCDBId from keyname numbers
74 // valid keyname: Run#firstRun_#lastRun_v#version_s#subVersion.root
75 TRegexp keyPattern("^Run[0-9]+_[0-9]+_v[0-9]+_s[0-9]+$");
76 keyPattern.Index(keyname, &mSize);
78 AliDebug(2,Form("Bad keyname <%s>.", keyname));
82 TObjArray* strArray = (TObjArray*) TString(keyname).Tokenize("_");
84 TString firstRunString(((TObjString*) strArray->At(0))->GetString());
85 runRange.SetFirstRun(atoi(firstRunString.Data() + 3));
86 runRange.SetLastRun(atoi(((TObjString*) strArray->At(1))->GetString()));
88 TString verString(((TObjString*) strArray->At(2))->GetString());
89 version = atoi(verString.Data() + 1);
91 TString subVerString(((TObjString*) strArray->At(3))->GetString());
92 subVersion = atoi(subVerString.Data() + 1);
99 //_____________________________________________________________________________
100 Bool_t AliCDBDump::IdToKeyName(const AliCDBRunRange& runRange, Int_t version,
101 Int_t subVersion, TString& keyname) {
102 // build key name from AliCDBId data (run range, version, subVersion)
104 if (!runRange.IsValid()) {
105 AliDebug(2,Form("Invalid run range <%d, %d>.",
106 runRange.GetFirstRun(), runRange.GetLastRun()));
111 AliDebug(2,Form("Invalid version <%d>.", version));
115 if (subVersion < 0) {
116 AliDebug(2,Form("Invalid subversion <%d>.", subVersion));
121 keyname += runRange.GetFirstRun();
123 keyname += runRange.GetLastRun();
127 keyname += subVersion;
132 //_____________________________________________________________________________
133 Bool_t AliCDBDump::MkDir(const TString& path) {
134 // descend into TDirectory, making TDirectories if they don't exist
135 TObjArray* strArray = (TObjArray*) path.Tokenize("/");
137 TIter iter(strArray);
140 while ((str = (TObjString*) iter.Next())) {
142 TString dirName(str->GetString());
143 if (!dirName.Length()) {
147 if (gDirectory->cd(dirName)) {
151 TDirectory* aDir = gDirectory->mkdir(dirName, "");
153 AliError(Form("Can't create directory <%s>!",
168 //_____________________________________________________________________________
169 Bool_t AliCDBDump::PrepareId(AliCDBId& id) {
170 // prepare id (version, subVersion) of the object that will be stored (called by PutEntry)
172 AliCDBRunRange aRunRange; // the runRange got from filename
173 AliCDBRunRange lastRunRange(-1,-1); // highest runRange found
174 Int_t aVersion, aSubVersion; // the version subVersion got from filename
175 Int_t lastVersion = 0, lastSubVersion = -1; // highest version and subVersion found
178 TIter iter(gDirectory->GetListOfKeys());
181 if (!id.HasVersion()) { // version not specified: look for highest version & subVersion
183 while ((key = (TKey*) iter.Next())) { // loop on keys
185 const char* keyName = key->GetName();
187 if (!KeyNameToId(keyName, aRunRange, aVersion,
190 "Bad keyname <%s>!I'll skip it.", keyName));
194 if (!aRunRange.Overlaps(id.GetAliCDBRunRange())) continue;
195 if(aVersion < lastVersion) continue;
196 if(aVersion > lastVersion) lastSubVersion = -1;
197 if(aSubVersion < lastSubVersion) continue;
198 lastVersion = aVersion;
199 lastSubVersion = aSubVersion;
200 lastRunRange = aRunRange;
203 id.SetVersion(lastVersion);
204 id.SetSubVersion(lastSubVersion + 1);
206 } else { // version specified, look for highest subVersion only
208 while ((key = (TKey*) iter.Next())) { // loop on the keys
210 const char* keyName = key->GetName();
212 if (!KeyNameToId(keyName, aRunRange, aVersion,
215 "Bad keyname <%s>!I'll skip it.", keyName));
219 if (aRunRange.Overlaps(id.GetAliCDBRunRange())
220 && aVersion == id.GetVersion()
221 && aSubVersion > lastSubVersion) {
222 lastSubVersion = aSubVersion;
223 lastRunRange = aRunRange;
228 id.SetSubVersion(lastSubVersion + 1);
231 TString lastStorage = id.GetLastStorage();
232 if(lastStorage.Contains(TString("grid"), TString::kIgnoreCase) &&
233 id.GetSubVersion() > 0 ){
234 AliError(Form("Grid to Dump Storage error! local object with version v%d_s%d found:",id.GetVersion(), id.GetSubVersion()-1));
235 AliError(Form("This object has been already transferred from Grid (check v%d_s0)!",id.GetVersion()));
239 if(lastStorage.Contains(TString("new"), TString::kIgnoreCase) &&
240 id.GetSubVersion() > 0 ){
241 AliDebug(2, Form("A NEW object is being stored with version v%d_s%d",
242 id.GetVersion(),id.GetSubVersion()));
243 AliDebug(2, Form("and it will hide previously stored object with v%d_s%d!",
244 id.GetVersion(),id.GetSubVersion()-1));
247 if(!lastRunRange.IsAnyRange() && !(lastRunRange.IsEqual(& id.GetAliCDBRunRange())))
248 AliWarning(Form("Run range modified w.r.t. previous version (Run%d_%d_v%d_s%d)",
249 lastRunRange.GetFirstRun(), lastRunRange.GetLastRun(),
250 id.GetVersion(), id.GetSubVersion()-1));
256 // //_____________________________________________________________________________
257 // Bool_t AliCDBDump::GetId(const AliCDBId& query, AliCDBId& result) {
258 // // look for filename matching query (called by GetEntry)
261 // AliCDBRunRange aRunRange; // the runRange got from filename
262 // Int_t aVersion, aSubVersion; // the version and subVersion got from filename
264 // TIter iter(gDirectory->GetListOfKeys());
267 // if (!query.HasVersion()) { // neither version and subversion specified -> look for highest version and subVersion
269 // while ((key = (TKey*) iter.Next())) { // loop on the keys
271 // if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
272 // // aRunRange, aVersion, aSubVersion filled from filename
274 // if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
275 // // aRunRange contains requested run!
277 // if (result.GetVersion() < aVersion) {
278 // result.SetVersion(aVersion);
279 // result.SetSubVersion(aSubVersion);
281 // result.SetFirstRun(
282 // aRunRange.GetFirstRun());
283 // result.SetLastRun(
284 // aRunRange.GetLastRun());
286 // } else if (result.GetVersion() == aVersion
287 // && result.GetSubVersion()
290 // result.SetSubVersion(aSubVersion);
292 // result.SetFirstRun(
293 // aRunRange.GetFirstRun());
294 // result.SetLastRun(
295 // aRunRange.GetLastRun());
296 // } else if (result.GetVersion() == aVersion
297 // && result.GetSubVersion() == aSubVersion){
298 // AliDebug(2,Form("More than one object valid for run %d, version %d_%d!",
299 // query.GetFirstRun(), aVersion, aSubVersion));
300 // result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
305 // } else if (!query.HasSubVersion()) { // version specified but not subversion -> look for highest subVersion
307 // result.SetVersion(query.GetVersion());
309 // while ((key = (TKey*) iter.Next())) { // loop on the keys
311 // if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
312 // // aRunRange, aVersion, aSubVersion filled from filename
314 // if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
315 // // aRunRange contains requested run!
317 // if(query.GetVersion() != aVersion) continue;
318 // // aVersion is requested version!
320 // if(result.GetSubVersion() == aSubVersion){
321 // AliDebug(2,Form("More than one object valid for run %d, version %d_%d!",
322 // query.GetFirstRun(), aVersion, aSubVersion));
323 // result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
326 // if( result.GetSubVersion() < aSubVersion) {
328 // result.SetSubVersion(aSubVersion);
330 // result.SetFirstRun(
331 // aRunRange.GetFirstRun());
332 // result.SetLastRun(
333 // aRunRange.GetLastRun());
337 // } else { // both version and subversion specified
339 // while ((key = (TKey*) iter.Next())) { // loop on the keys
341 // if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
342 // // aRunRange, aVersion, aSubVersion filled from filename
344 // if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
345 // // aRunRange contains requested run!
347 // if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue;
348 // // aVersion and aSubVersion are requested version and subVersion!
350 // if(result.GetVersion() == aVersion && result.GetSubVersion() == aSubVersion){
351 // AliDebug(2,Form("More than one object valid for run %d, version %d_%d!",
352 // query.GetFirstRun(), aVersion, aSubVersion));
353 // result.SetRunRange(-1,-1); result.SetVersion(-1); result.SetSubVersion(-1);
356 // result.SetVersion(aVersion);
357 // result.SetSubVersion(aSubVersion);
358 // result.SetFirstRun(aRunRange.GetFirstRun());
359 // result.SetLastRun(aRunRange.GetLastRun());
367 //_____________________________________________________________________________
368 AliCDBId* AliCDBDump::GetId(const AliCDBId& query) {
369 // look for filename matching query (called by GetEntry)
372 AliCDBRunRange aRunRange; // the runRange got from filename
373 Int_t aVersion, aSubVersion; // the version and subVersion got from filename
375 TIter iter(gDirectory->GetListOfKeys());
378 AliCDBId* result = new AliCDBId();
379 result->SetPath(query.GetPath());
381 if (!query.HasVersion()) { // neither version and subversion specified -> look for highest version and subVersion
383 while ((key = (TKey*) iter.Next())) { // loop on the keys
385 if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
386 // aRunRange, aVersion, aSubVersion filled from filename
388 if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
389 // aRunRange contains requested run!
391 if (result->GetVersion() < aVersion) {
392 result->SetVersion(aVersion);
393 result->SetSubVersion(aSubVersion);
396 aRunRange.GetFirstRun());
398 aRunRange.GetLastRun());
400 } else if (result->GetVersion() == aVersion
401 && result->GetSubVersion()
404 result->SetSubVersion(aSubVersion);
407 aRunRange.GetFirstRun());
409 aRunRange.GetLastRun());
410 } else if (result->GetVersion() == aVersion
411 && result->GetSubVersion() == aSubVersion){
412 AliError(Form("More than one object valid for run %d, version %d_%d!",
413 query.GetFirstRun(), aVersion, aSubVersion));
419 } else if (!query.HasSubVersion()) { // version specified but not subversion -> look for highest subVersion
421 result->SetVersion(query.GetVersion());
423 while ((key = (TKey*) iter.Next())) { // loop on the keys
425 if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
426 // aRunRange, aVersion, aSubVersion filled from filename
428 if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
429 // aRunRange contains requested run!
431 if(query.GetVersion() != aVersion) continue;
432 // aVersion is requested version!
434 if(result->GetSubVersion() == aSubVersion){
435 AliError(Form("More than one object valid for run %d, version %d_%d!",
436 query.GetFirstRun(), aVersion, aSubVersion));
440 if( result->GetSubVersion() < aSubVersion) {
442 result->SetSubVersion(aSubVersion);
445 aRunRange.GetFirstRun());
447 aRunRange.GetLastRun());
451 } else { // both version and subversion specified
453 while ((key = (TKey*) iter.Next())) { // loop on the keys
455 if (!KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion)) continue;
456 // aRunRange, aVersion, aSubVersion filled from filename
458 if (!aRunRange.Comprises(query.GetAliCDBRunRange())) continue;
459 // aRunRange contains requested run!
461 if(query.GetVersion() != aVersion || query.GetSubVersion() != aSubVersion) continue;
462 // aVersion and aSubVersion are requested version and subVersion!
464 if(result->GetVersion() == aVersion && result->GetSubVersion() == aSubVersion){
465 AliError(Form("More than one object valid for run %d, version %d_%d!",
466 query.GetFirstRun(), aVersion, aSubVersion));
470 result->SetVersion(aVersion);
471 result->SetSubVersion(aSubVersion);
472 result->SetFirstRun(aRunRange.GetFirstRun());
473 result->SetLastRun(aRunRange.GetLastRun());
481 //_____________________________________________________________________________
482 AliCDBEntry* AliCDBDump::GetEntry(const AliCDBId& queryId) {
483 // get AliCDBEntry from the database
485 TDirectory::TContext context(gDirectory, fFile);
487 if (!(fFile && fFile->IsOpen())) {
488 AliError("AliCDBDump storage is not initialized properly");
492 if (!gDirectory->cd(queryId.GetPath())) {
496 AliCDBId *dataId = GetEntryId(queryId);
498 if (!dataId || !dataId->IsSpecified()) {
499 if(dataId) delete dataId;
504 if (!IdToKeyName(dataId->GetAliCDBRunRange(), dataId->GetVersion(),
505 dataId->GetSubVersion(), keyname)) {
506 AliDebug(2,Form("Bad ID encountered! Subnormal error!"));
511 // get the only AliCDBEntry object from the file
512 // the object in the file is an AliCDBEntry entry named keyname
513 // keyName = Run#firstRun_#lastRun_v#version_s#subVersion
515 TObject* anObject = gDirectory->Get(keyname);
517 AliDebug(2,Form("Bad storage data: NULL entry object!"));
522 if (AliCDBEntry::Class() != anObject->IsA()) {
523 AliDebug(2,Form("Bad storage data: Invalid entry object!"));
528 ((AliCDBEntry*) anObject)->SetLastStorage("dump");
531 return (AliCDBEntry*) anObject;
534 //_____________________________________________________________________________
535 AliCDBId* AliCDBDump::GetEntryId(const AliCDBId& queryId) {
536 // get AliCDBEntry from the database
538 TDirectory::TContext context(gDirectory, fFile);
540 if (!(fFile && fFile->IsOpen())) {
541 AliError("AliCDBDump storage is not initialized properly");
545 if (!gDirectory->cd(queryId.GetPath())) {
549 AliCDBId* dataId = 0;
551 // look for a filename matching query requests (path, runRange, version, subVersion)
552 if (!queryId.HasVersion()) {
553 // if version is not specified, first check the selection criteria list
554 AliCDBId selectedId(queryId);
555 GetSelection(&selectedId);
556 dataId = GetId(queryId);
558 dataId = GetId(queryId);
561 if (dataId && !dataId->IsSpecified()) {
569 //_____________________________________________________________________________
570 void AliCDBDump::GetEntriesForLevel0(const AliCDBId& queryId, TList* result) {
571 // multiple request (AliCDBStorage::GetAll)
573 TDirectory* saveDir = gDirectory;
575 TIter iter(gDirectory->GetListOfKeys());
578 while ((key = (TKey*) iter.Next())) {
580 TString keyNameStr(key->GetName());
581 if (queryId.GetAliCDBPath().Level1Comprises(keyNameStr)) {
582 gDirectory->cd(keyNameStr);
583 GetEntriesForLevel1(queryId, result);
590 //_____________________________________________________________________________
591 void AliCDBDump::GetEntriesForLevel1(const AliCDBId& queryId, TList* result) {
592 // multiple request (AliCDBStorage::GetAll)
594 TIter iter(gDirectory->GetListOfKeys());
597 TDirectory* level0Dir = (TDirectory*) gDirectory->GetMother();
599 while ((key = (TKey*) iter.Next())) {
601 TString keyNameStr(key->GetName());
602 if (queryId.GetAliCDBPath().Level2Comprises(keyNameStr)) {
604 AliCDBPath aPath(level0Dir->GetName(),
605 gDirectory->GetName(), keyNameStr);
606 AliCDBId anId(aPath, queryId.GetAliCDBRunRange(),
607 queryId.GetVersion(), -1);
609 AliCDBEntry* anEntry = GetEntry(anId);
611 result->Add(anEntry);
620 //_____________________________________________________________________________
621 TList* AliCDBDump::GetEntries(const AliCDBId& queryId) {
622 // multiple request (AliCDBStorage::GetAll)
624 TDirectory::TContext context(gDirectory, fFile);
626 if (!(fFile && fFile->IsOpen())) {
627 AliError("AliCDBDump storage is not initialized properly");
631 TList* result = new TList();
634 TIter iter(gDirectory->GetListOfKeys());
637 while ((key = (TKey*) iter.Next())) {
639 TString keyNameStr(key->GetName());
640 if (queryId.GetAliCDBPath().Level0Comprises(keyNameStr)) {
641 gDirectory->cd(keyNameStr);
642 GetEntriesForLevel0(queryId, result);
651 //_____________________________________________________________________________
652 Bool_t AliCDBDump::PutEntry(AliCDBEntry* entry, const char* mirrors) {
653 // put an AliCDBEntry object into the database
655 TDirectory::TContext context(gDirectory, fFile);
657 if (!(fFile && fFile->IsOpen())) {
658 AliError("AliCDBDump storage is not initialized properly");
663 AliError("AliCDBDump storage is read only!");
667 TString mirrorsString(mirrors);
668 if(!mirrorsString.IsNull())
669 AliWarning("AliCDBLocal storage cannot take mirror SEs into account. They will be ignored.");
671 AliCDBId& id = entry->GetId();
673 if (!gDirectory->cd(id.GetPath())) {
674 if (!MkDir(id.GetPath())) {
675 AliError(Form("Can't open directory <%s>!",
676 id.GetPath().Data()));
681 // set version and subVersion for the entry to be stored
682 if (!PrepareId(id)) {
686 // build keyname from entry's id
688 if (!IdToKeyName(id.GetAliCDBRunRange(), id.GetVersion(), id.GetSubVersion(), keyname)) {
689 AliError("Invalid ID encountered! Subnormal error!");
693 // write object (key name: Run#firstRun_#lastRun_v#version_s#subVersion)
694 Bool_t result = gDirectory->WriteTObject(entry, keyname);
696 AliError(Form("Can't write entry to file: %s",
701 AliInfo(Form("CDB object stored into file %s",fFile->GetName()));
702 AliInfo(Form("TDirectory/key name: %s/%s",id.GetPath().Data(),keyname.Data()));
707 //_____________________________________________________________________________
708 TList* AliCDBDump::GetIdListFromFile(const char* fileName){
710 TString turl(fileName);
711 if (turl[0] != '/') {
712 turl.Prepend(TString(gSystem->WorkingDirectory()) + '/');
714 TFile *file = TFile::Open(turl);
716 AliError(Form("Can't open selection file <%s>!", turl.Data()));
721 TList *list = new TList();
729 keycycle = "AliCDBId;";
732 id = (AliCDBId*) file->Get(keycycle);
736 file->Close(); delete file; file=0;
740 //_____________________________________________________________________________
741 Bool_t AliCDBDump::Contains(const char* path) const{
742 // check for path in storage
744 TDirectory::TContext context(gDirectory, fFile);
745 if (!(fFile && fFile->IsOpen())) {
746 AliError("AliCDBDump storage is not initialized properly");
750 return gDirectory->cd(path);
754 //_____________________________________________________________________________
755 void AliCDBDump::QueryValidFiles()
757 // Query the CDB for files valid for AliCDBStorage::fRun
758 // fills list fValidFileIds with AliCDBId objects created from file name
760 AliError("Not yet (and maybe never) implemented");
763 //_____________________________________________________________________________
764 Bool_t AliCDBDump::IdToFilename(const AliCDBId& /*id*/, TString& /*filename*/) const {
765 // build file name from AliCDBId (path, run range, version) and fDBFolder
767 AliError("Not implemented");
772 //_____________________________________________________________________________
773 void AliCDBDump::SetRetry(Int_t /* nretry */, Int_t /* initsec */) {
775 // Function to set the exponential retry for putting entries in the OCDB
777 AliInfo("This function sets the exponential retry for putting entries in the OCDB - to be used ONLY for AliCDBGrid --> returning without doing anything");
781 /////////////////////////////////////////////////////////////////////////////////////////////////
783 // AliCDBDump factory //
785 /////////////////////////////////////////////////////////////////////////////////////////////////
787 ClassImp(AliCDBDumpFactory)
789 //_____________________________________________________________________________
790 Bool_t AliCDBDumpFactory::Validate(const char* dbString) {
791 // check if the string is valid dump URI
793 TRegexp dbPattern("^dump://.+$");
795 return TString(dbString).Contains(dbPattern);
798 //_____________________________________________________________________________
799 AliCDBParam* AliCDBDumpFactory::CreateParameter(const char* dbString) {
800 // create AliCDBDumpParam class from the URI string
802 if (!Validate(dbString)) {
806 TString pathname(dbString + sizeof("dump://") - 1);
810 if (pathname.Contains(TRegexp(";ReadOnly$"))) {
811 pathname.Resize(pathname.Length() - sizeof(";ReadOnly") + 1);
817 gSystem->ExpandPathName(pathname);
819 if (pathname[0] != '/') {
820 pathname.Prepend(TString(gSystem->WorkingDirectory()) + '/');
823 return new AliCDBDumpParam(pathname, readOnly);
826 //_____________________________________________________________________________
827 AliCDBStorage* AliCDBDumpFactory::Create(const AliCDBParam* param) {
828 // create AliCDBDump storage instance from parameters
830 if (AliCDBDumpParam::Class() == param->IsA()) {
832 const AliCDBDumpParam* dumpParam =
833 (const AliCDBDumpParam*) param;
835 return new AliCDBDump(dumpParam->GetPath(),
836 dumpParam->IsReadOnly());
842 /////////////////////////////////////////////////////////////////////////////////////////////////
844 // AliCDBDump parameter class //
846 /////////////////////////////////////////////////////////////////////////////////////////////////
848 ClassImp(AliCDBDumpParam)
850 //_____________________________________________________________________________
851 AliCDBDumpParam::AliCDBDumpParam():
852 fDBPath(), fReadOnly(kFALSE)
854 // default constructor
858 //_____________________________________________________________________________
859 AliCDBDumpParam::AliCDBDumpParam(const char* dbPath, Bool_t readOnly):
860 fDBPath(dbPath), fReadOnly(readOnly)
876 //_____________________________________________________________________________
877 AliCDBDumpParam::~AliCDBDumpParam() {
882 //_____________________________________________________________________________
883 AliCDBParam* AliCDBDumpParam::CloneParam() const {
886 return new AliCDBDumpParam(fDBPath, fReadOnly);
889 //_____________________________________________________________________________
890 ULong_t AliCDBDumpParam::Hash() const {
891 // return Hash function
893 return fDBPath.Hash();
896 //_____________________________________________________________________________
897 Bool_t AliCDBDumpParam::IsEqual(const TObject* obj) const {
898 // check if this object is equal to AliCDBParam obj
904 if (AliCDBDumpParam::Class() != obj->IsA()) {
908 AliCDBDumpParam* other = (AliCDBDumpParam*) obj;
910 return fDBPath == other->fDBPath;