26 ClassImp(TFileInfoMeta);
31 TFileInfo::TFileInfo(
const char *in, Long64_t size,
const char *uuid,
32 const char *md5, TObject *meta)
33 : fCurrentUrl(0), fUrlList(0), fSize(-1), fUUID(0), fMD5(0),
34 fMetaDataList(0), fIndex(-1)
42 if (size > -1) fSize = size;
46 fUUID =
new TUUID(uuid);
58 RemoveMetaData(meta->GetName());
63 SetName(fUUID->AsString());
64 SetTitle(
"TFileInfo");
67 ResetBit(TFileInfo::kSortWithIndex);
73 TFileInfo::TFileInfo(
const TFileInfo &fi) : TNamed(fi.GetName(), fi.GetTitle()),
74 fCurrentUrl(0), fUrlList(0),
75 fSize(fi.fSize), fUUID(0), fMD5(0),
76 fMetaDataList(0), fIndex(fi.fIndex)
81 TIter nxu(fi.fUrlList);
83 while ((u = (TUrl *)nxu())) {
84 fUrlList->Add(
new TUrl(u->GetUrl(), kTRUE));
91 fUUID =
new TUUID(fi.fUUID->AsString());
94 fMD5 =
new TMD5(*(fi.fMD5));
97 ResetBit(TFileInfo::kStaged);
98 ResetBit(TFileInfo::kCorrupted);
99 if (fi.TestBit(TFileInfo::kStaged)) SetBit(TFileInfo::kStaged);
100 if (fi.TestBit(TFileInfo::kCorrupted)) SetBit(TFileInfo::kCorrupted);
102 if (fi.fMetaDataList) {
103 fMetaDataList =
new TList;
104 fMetaDataList->SetOwner();
105 TIter nxm(fi.fMetaDataList);
106 TFileInfoMeta *fim = 0;
107 while ((fim = (TFileInfoMeta *)nxm())) {
108 fMetaDataList->Add(
new TFileInfoMeta(*fim));
113 ResetBit(TFileInfo::kSortWithIndex);
119 TFileInfo::~TFileInfo()
121 SafeDelete(fMetaDataList);
124 SafeDelete(fUrlList);
156 void TFileInfo::ParseInput(
const char *in)
159 if (!in || strlen(in) <= 0)
return;
163 while (sin.Tokenize(t, f1,
" ")) {
164 if (t.BeginsWith(
"sz:")) {
167 if (t.IsDigit()) sscanf(t.Data(),
"%lld", &fSize);
168 }
else if (t.BeginsWith(
"md5:")) {
171 if (t.Length() >= 32) {
173 if (fMD5->SetDigest(t) != 0)
176 }
else if (t.BeginsWith(
"uuid:")) {
179 if (t.Length() > 0) fUUID =
new TUUID(t);
180 }
else if (t.BeginsWith(
"tree:")) {
183 TString nm, se, sf, sl;
184 Long64_t ent = -1, fst= -1, lst = -1;
186 if (t.Tokenize(nm, f2,
","))
187 if (t.Tokenize(se, f2,
","))
188 if (t.Tokenize(sf, f2,
","))
189 t.Tokenize(sl, f2,
",");
190 if (!(nm.IsNull())) {
191 if (se.IsDigit()) sscanf(se.Data(),
"%lld", &ent);
192 if (sf.IsDigit()) sscanf(sf.Data(),
"%lld", &fst);
193 if (sl.IsDigit()) sscanf(sl.Data(),
"%lld", &lst);
194 TFileInfoMeta *meta =
new TFileInfoMeta(nm,
"TTree", ent, fst, lst);
195 RemoveMetaData(meta->GetName());
198 }
else if (t.BeginsWith(
"obj:")) {
204 if (t.Tokenize(nm, f2,
","))
205 if (t.Tokenize(cl, f2,
","))
206 t.Tokenize(se, f2,
",");
207 if (cl.IsNull()) cl =
"TObject";
208 if (!(nm.IsNull())) {
209 if (se.IsDigit()) sscanf(se.Data(),
"%lld", &ent);
210 TFileInfoMeta *meta =
new TFileInfoMeta(nm, cl, ent);
213 }
else if (t.BeginsWith(
"idx:")) {
216 if (t.IsDigit()) sscanf(t.Data(),
"%d", &fIndex);
219 if (t.BeginsWith(
"url:")) t.Replace(0, 4,
"");
222 while (t.Tokenize(u, f2,
",")) {
223 if (!(u.IsNull())) AddUrl(u);
237 void TFileInfo::SetUUID(
const char *uuid)
240 if (fUUID)
delete fUUID;
241 fUUID =
new TUUID(uuid);
248 TUrl *TFileInfo::GetCurrentUrl()
const
251 const_cast<TFileInfo*
>(
this)->ResetUrl();
260 TUrl *TFileInfo::NextUrl()
265 TUrl *returl = fCurrentUrl;
268 fCurrentUrl = (TUrl*)fUrlList->After(fCurrentUrl);
276 TUrl *TFileInfo::FindByUrl(
const char *url, Bool_t withDeflt)
278 TIter nextUrl(fUrlList);
282 while ((urlelement = (TUrl*) nextUrl())) {
283 if (TString(urlelement->GetUrl(withDeflt)).Index(rg) != kNPOS) {
295 Bool_t TFileInfo::AddUrl(
const char *url, Bool_t infront)
301 fUrlList =
new TList;
302 fUrlList->SetOwner();
305 TUrl *newurl =
new TUrl(url, kTRUE);
307 if (fUrlList->GetSize() == 0)
308 fCurrentUrl = newurl;
311 fUrlList->AddFirst(newurl);
313 fUrlList->Add(newurl);
320 Bool_t TFileInfo::RemoveUrl(
const char *url)
323 if ((lurl = FindByUrl(url))) {
324 fUrlList->Remove(lurl);
325 if (lurl == fCurrentUrl)
336 Bool_t TFileInfo::RemoveUrlAt(Int_t i)
339 if ((tUrl = dynamic_cast<TUrl *>(fUrlList->At(i))) != NULL) {
340 fUrlList->Remove(tUrl);
341 if (tUrl == fCurrentUrl)
354 Bool_t TFileInfo::SetCurrentUrl(
const char *url)
357 if ((lurl = FindByUrl(url))) {
368 Bool_t TFileInfo::SetCurrentUrl(TUrl *url)
370 if (url && fUrlList && fUrlList->FindObject(url)) {
384 Bool_t TFileInfo::AddMetaData(TObject *meta)
387 if (!fMetaDataList) {
388 fMetaDataList =
new TList;
389 fMetaDataList->SetOwner();
391 fMetaDataList->Add(meta);
401 Bool_t TFileInfo::RemoveMetaData(
const char *meta)
404 if (!meta || strlen(meta) <= 0) {
405 SafeDelete(fMetaDataList);
408 TObject *o = fMetaDataList->FindObject(meta);
410 fMetaDataList->Remove(o);
424 TFileInfoMeta *TFileInfo::GetMetaData(
const char *meta)
const
428 if (!meta || strlen(meta) <= 0)
429 m = (TFileInfoMeta *) fMetaDataList->First();
431 m = (TFileInfoMeta *) fMetaDataList->FindObject(meta);
433 TClass *c = m->IsA();
434 return (c && c->InheritsFrom(TFileInfoMeta::Class())) ? m : 0;
443 Int_t TFileInfo::Compare(
const TObject *obj)
const
446 if (TestBit(TFileInfo::kSortWithIndex)) {
447 const TFileInfo *fi =
dynamic_cast<const TFileInfo *
>(obj);
451 if (fIndex < fi->fIndex) {
453 }
else if (fIndex > fi->fIndex) {
460 }
else if (TFileInfo::Class() != obj->IsA()) {
463 rc = (GetFirstUrl()->Compare(((TFileInfo*)obj)->GetFirstUrl()));
477 void TFileInfo::Print(Option_t *option)
const
479 if (GetMD5()) GetMD5()->Final();
481 if (opt.Contains(
"L", TString::kIgnoreCase)) {
483 Printf(
"UUID: %s\nMD5: %s\nSize: %lld\nIndex: %d",
484 GetUUID() ? GetUUID()->AsString() :
"undef",
485 GetMD5() ? GetMD5()->AsString() :
"undef",
486 GetSize(), GetIndex());
488 TIter next(fUrlList);
490 Printf(
" === URLs ===");
491 while ((u = (TUrl*)next()))
492 Printf(
" URL: %s", u->GetUrl());
494 TIter nextm(fMetaDataList);
496 while ((m = (TObject*) nextm())) {
497 Printf(
" === Meta Data Object ===");
501 TString out(
"current-url-undef -|-|- md5-undef");
502 if (GetCurrentUrl()) out.ReplaceAll(
"current-url-undef", GetCurrentUrl()->GetUrl());
505 if (opt.Contains(
"T:")) deft = opt(opt.Index(
"T:")+2, opt.Length());
506 TFileInfoMeta *meta = 0;
507 if (fMetaDataList && !deft.IsNull()) meta = (TFileInfoMeta *) fMetaDataList->FindObject(deft);
508 if (fMetaDataList && !meta) meta = (TFileInfoMeta *) fMetaDataList->First();
509 if (meta) out.ReplaceAll(
"-|-|-", TString::Format(
"%s|%s|%lld", meta->GetName(),
510 meta->GetTitle(), meta->GetEntries()));
512 out.ReplaceAll(
"md5-undef", TString::Format(
"%s", GetMD5()->AsString()));
513 Printf(
"%s", out.Data());
521 TFileInfoMeta::TFileInfoMeta(
const char *objPath,
const char *objClass,
522 Long64_t entries, Long64_t first, Long64_t last,
523 Long64_t totbytes, Long64_t zipbytes)
524 : TNamed(objPath, objClass), fEntries(entries), fFirst(first),
525 fLast(last), fTotBytes(totbytes), fZipBytes(zipbytes)
528 if (!p.BeginsWith(
"/")) {
533 TClass *c = TClass::GetClass(objClass);
534 fIsTree = (c && c->InheritsFrom(
"TTree")) ? kTRUE : kFALSE;
535 ResetBit(TFileInfoMeta::kExternal);
541 TFileInfoMeta::TFileInfoMeta(
const char *objPath,
const char *objDir,
542 const char *objClass, Long64_t entries,
543 Long64_t first, Long64_t last,
544 Long64_t totbytes, Long64_t zipbytes)
545 : TNamed(objPath, objClass), fEntries(entries), fFirst(first),
546 fLast(last), fTotBytes(totbytes), fZipBytes(zipbytes)
548 TString sdir = objDir;
549 if (!sdir.BeginsWith(
"/"))
551 if (!sdir.EndsWith(
"/"))
556 TClass *c = TClass::GetClass(objClass);
557 fIsTree = (c && c->InheritsFrom(
"TTree")) ? kTRUE : kFALSE;
558 ResetBit(TFileInfoMeta::kExternal);
564 TFileInfoMeta::TFileInfoMeta(
const TFileInfoMeta &m)
565 : TNamed(m.GetName(), m.GetTitle())
567 fEntries = m.fEntries;
571 fTotBytes = m.fTotBytes;
572 fZipBytes = m.fZipBytes;
573 ResetBit(TFileInfoMeta::kExternal);
574 if (m.TestBit(TFileInfoMeta::kExternal)) SetBit(TFileInfoMeta::kExternal);
580 const char *TFileInfoMeta::GetDirectory()
const
582 return gSystem->DirName(GetName());
589 const char *TFileInfoMeta::GetObject()
const
591 return gSystem->BaseName(GetName());
597 void TFileInfoMeta::Print(Option_t * )
const
599 Printf(
" Name: %s\n Class: %s\n Entries: %lld\n"
600 " First: %lld\n Last: %lld",
601 fName.Data(), fTitle.Data(), fEntries, fFirst, fLast);