28 #include <TObjString.h> 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"));
69 Int_t& version, Int_t& subVersion) {
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));
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);
101 Int_t subVersion, TString& keyname) {
105 AliDebug(2,Form(
"Invalid run range <%d, %d>.",
111 AliDebug(2,Form(
"Invalid version <%d>.", version));
115 if (subVersion < 0) {
116 AliDebug(2,Form(
"Invalid subversion <%d>.", subVersion));
127 keyname += subVersion;
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>!",
174 Int_t aVersion, aSubVersion;
175 Int_t lastVersion = 0, lastSubVersion = -1;
178 TIter iter(gDirectory->GetListOfKeys());
181 if (!
id.HasVersion()) {
183 while ((key = (TKey*) iter.Next())) {
185 const char* keyName = key->GetName();
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);
208 while ((key = (TKey*) iter.Next())) {
210 const char* keyName = key->GetName();
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)",
250 id.GetVersion(),
id.GetSubVersion()-1));
373 Int_t aVersion, aSubVersion;
375 TIter iter(gDirectory->GetListOfKeys());
383 while ((key = (TKey*) iter.Next())) {
385 if (!
KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion))
continue;
412 AliError(Form(
"More than one object valid for run %d, version %d_%d!",
423 while ((key = (TKey*) iter.Next())) {
425 if (!
KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion))
continue;
435 AliError(Form(
"More than one object valid for run %d, version %d_%d!",
453 while ((key = (TKey*) iter.Next())) {
455 if (!
KeyNameToId(key->GetName(), aRunRange, aVersion, aSubVersion))
continue;
465 AliError(Form(
"More than one object valid for run %d, version %d_%d!",
485 TDirectory::TContext context(gDirectory,
fFile);
488 AliError(
"AliCDBDump storage is not initialized properly");
492 if (!gDirectory->cd(queryId.
GetPath())) {
499 if(dataId)
delete dataId;
506 AliDebug(2,Form(
"Bad ID encountered! Subnormal error!"));
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!"));
538 TDirectory::TContext context(gDirectory,
fFile);
541 AliError(
"AliCDBDump storage is not initialized properly");
545 if (!gDirectory->cd(queryId.
GetPath())) {
556 dataId =
GetId(queryId);
558 dataId =
GetId(queryId);
573 TDirectory* saveDir = gDirectory;
575 TIter iter(gDirectory->GetListOfKeys());
578 while ((key = (TKey*) iter.Next())) {
580 TString keyNameStr(key->GetName());
582 gDirectory->cd(keyNameStr);
594 TIter iter(gDirectory->GetListOfKeys());
597 TDirectory* level0Dir = (TDirectory*) gDirectory->GetMother();
599 while ((key = (TKey*) iter.Next())) {
601 TString keyNameStr(key->GetName());
605 gDirectory->GetName(), keyNameStr);
611 result->Add(anEntry);
624 TDirectory::TContext context(gDirectory,
fFile);
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());
641 gDirectory->cd(keyNameStr);
655 TDirectory::TContext context(gDirectory,
fFile);
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.");
673 if (!gDirectory->cd(
id.GetPath())) {
674 if (!
MkDir(
id.GetPath())) {
675 AliError(Form(
"Can't open directory <%s>!",
676 id.GetPath().Data()));
688 if (!
IdToKeyName(
id.GetAliCDBRunRange(),
id.GetVersion(),
id.GetSubVersion(), keyname)) {
689 AliError(
"Invalid ID encountered! Subnormal error!");
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()));
710 TString turl(fileName);
711 if (turl[0] !=
'/') {
712 turl.Prepend(TString(gSystem->WorkingDirectory()) +
'/');
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;
744 TDirectory::TContext context(gDirectory,
fFile);
746 AliError(
"AliCDBDump storage is not initialized properly");
750 return gDirectory->cd(path);
760 AliError(
"Not yet (and maybe never) implemented");
777 AliInfo(
"This function sets the exponential retry for putting entries in the OCDB - to be used ONLY for AliCDBGrid --> returning without doing anything");
793 TRegexp dbPattern(
"^dump://.+$");
795 return TString(dbString).Contains(dbPattern);
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()) +
'/');
830 if (AliCDBDumpParam::Class() == param->IsA()) {
904 if (AliCDBDumpParam::Class() != obj->IsA()) {
void SetFirstRun(Int_t firstRun)
void SetURI(const char *uri)
TFile * Open(const char *filename, Long64_t &nevents)
Bool_t IsReadOnly() const
void GetEntriesForLevel1(const AliCDBId &query, TList *result)
Bool_t HasSubVersion() const
Bool_t KeyNameToId(const char *keyname, AliCDBRunRange &runRange, Int_t &version, Int_t &subVersion)
Bool_t IdToKeyName(const AliCDBRunRange &runRange, Int_t version, Int_t subVersion, TString &keyname)
void GetEntriesForLevel0(const AliCDBId &query, TList *result)
Bool_t MkDir(const TString &dir)
void SetPath(const char *path)
Bool_t Level1Comprises(const TString &str) const
virtual AliCDBStorage * Create(const AliCDBParam *param)
Bool_t Overlaps(const AliCDBRunRange &other) const
void SetSubVersion(Int_t subVersion)
const AliCDBPath & GetAliCDBPath() const
virtual Bool_t IsEqual(const TObject *obj) const
virtual void QueryValidFiles()
virtual AliCDBId * GetEntryId(const AliCDBId &query)
const AliCDBRunRange & GetAliCDBRunRange() const
Bool_t Level2Comprises(const TString &str) const
AliCDBId * GetId(const AliCDBId &query)
virtual Bool_t IdToFilename(const AliCDBId &id, TString &filename) const
TString fileName(const char *dir, int runNumber, const char *da, int i, const char *type)
#define AliWarning(message)
Bool_t Level0Comprises(const TString &str) const
AliCDBDump(const AliCDBDump &source)
void SetVersion(Int_t version)
void SetFirstRun(Int_t firstRun)
void GetSelection(AliCDBId *id)
Int_t GetFirstRun() const
virtual Bool_t Contains(const char *path) const
virtual TList * GetIdListFromFile(const char *fileName)
virtual void SetRetry(Int_t, Int_t)
Bool_t IsAnyRange() const
virtual Bool_t PutEntry(AliCDBEntry *entry, const char *mirrors="")
#define AliDebug(logLevel, message)
void SetType(const char *type)
void SetLastStorage(TString &lastStorage)
Bool_t HasVersion() const
const TString & GetPath() const
virtual AliCDBParam * CloneParam() const
Bool_t IsSpecified() const
virtual AliCDBParam * CreateParameter(const char *dbString)
virtual TList * GetEntries(const AliCDBId &query)
#define AliError(message)
virtual Bool_t IsEqual(const TObject *obj) const
virtual ~AliCDBDumpParam()
void SetLastRun(Int_t lastRun)
Bool_t Comprises(const AliCDBRunRange &other) const
virtual ULong_t Hash() const
Bool_t PrepareId(AliCDBId &id)
Int_t GetFirstRun() const
const TString & GetPath() const
virtual AliCDBEntry * GetEntry(const AliCDBId &query)
void SetLastRun(Int_t lastRun)
Int_t GetSubVersion() const