2c8628dd |
1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
3 | * * |
4 | * Author: The ALICE Off-line Project. * |
5 | * Contributors are mentioned in the code where appropriate. * |
6 | * * |
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 | **************************************************************************/ |
15 | |
16 | /* $Id$ */ |
17 | |
18 | /////////////////////////////////////////////////////////////////////////////// |
19 | // // |
20 | // access classes for a data base in a (local) file // |
21 | // // |
22 | /////////////////////////////////////////////////////////////////////////////// |
23 | |
24 | |
25 | #include <TFile.h> |
26 | #include <TKey.h> |
27 | #include <TROOT.h> |
28 | #include "AliLog.h" |
29 | #include "AliRunData.h" |
30 | #include "AliRunDataFile.h" |
31 | |
32 | |
33 | ClassImp(AliRunDataFile) |
34 | |
35 | |
36 | //_____________________________________________________________________________ |
37 | AliRunDataFile::AliRunDataFile(const char* fileName, Bool_t readOnly) : |
38 | AliRunDataStorage(), |
39 | fFile(NULL) |
40 | { |
41 | // constructor |
42 | |
43 | if (!fileName) { |
44 | AliError("no file name given"); |
45 | return; |
46 | } |
47 | TDirectory* saveDir = gDirectory; |
48 | fFile = TFile::Open(fileName, ((readOnly) ? "READ" : "UPDATE")); |
49 | if (saveDir) saveDir->cd(); else gROOT->cd(); |
50 | if (!fFile || !fFile->IsOpen()) { |
51 | AliError(Form("could not open file %s", fileName)); |
52 | fFile = NULL; |
53 | } |
54 | } |
55 | |
56 | //_____________________________________________________________________________ |
57 | AliRunDataFile::~AliRunDataFile() |
58 | { |
59 | // destructor |
60 | |
61 | if (fFile) { |
62 | fFile->Close(); |
63 | delete fFile; |
64 | } |
65 | } |
66 | |
67 | //_____________________________________________________________________________ |
68 | AliRunDataFile::AliRunDataFile(const AliRunDataFile& /*db*/) : |
69 | AliRunDataStorage(), |
70 | fFile(NULL) |
71 | { |
72 | // copy constructor |
73 | |
74 | AliFatal("not implemented"); |
75 | } |
76 | |
77 | //_____________________________________________________________________________ |
78 | AliRunDataFile& AliRunDataFile::operator = (const AliRunDataFile& /*db*/) |
79 | { |
80 | // assignment operator |
81 | |
82 | AliFatal("not implemented"); |
83 | return *this; |
84 | } |
85 | |
86 | |
87 | //_____________________________________________________________________________ |
88 | AliRunData* AliRunDataFile::GetEntry(AliMetaData& metaData, Int_t runNumber) |
89 | { |
90 | // get an object from the data base |
91 | |
92 | // go to the directory |
93 | TDirectory* saveDir = gDirectory; |
94 | TString name(metaData.GetName()); |
95 | Int_t last = name.Last('/'); |
96 | if (last < 0) { |
97 | fFile->cd(); |
98 | } else { |
99 | TString dirName(name(0, last)); |
100 | if (!fFile->cd(dirName)) { |
101 | AliDebug(1, Form("no directory %s found", dirName.Data())); |
102 | if (saveDir) saveDir->cd(); else gROOT->cd(); |
103 | return NULL; |
104 | } |
105 | name.Remove(0, last+1); |
106 | } |
107 | |
108 | TKey* key = fFile->GetKey(name); |
109 | if (!key) { |
110 | AliDebug(1, Form("no object with name %s found", metaData.GetName())); |
111 | if (saveDir) saveDir->cd(); else gROOT->cd(); |
112 | return NULL; |
113 | } |
114 | Int_t nCycles = key->GetCycle(); |
115 | |
116 | // find the closest entry |
117 | AliRunData* closestEntry = NULL; |
118 | for (Int_t iCycle = nCycles; iCycle > 0; iCycle--) { |
119 | key = fFile->GetKey(name, iCycle); |
120 | if (!key) continue; |
121 | AliRunData* entry = (AliRunData*) key->ReadObj(); |
122 | if (!entry) continue; |
123 | if (!entry->InheritsFrom(AliRunData::Class())) { |
124 | AliMetaData metaData; |
125 | entry = new AliRunData(entry, metaData); |
126 | } |
127 | if (!entry->GetMetaData().IsValid(runNumber, &metaData) || |
128 | (entry->Compare(closestEntry) <= 0)) { |
129 | delete entry; |
130 | continue; |
131 | } |
132 | delete closestEntry; |
133 | closestEntry = entry; |
134 | } |
135 | if (saveDir) saveDir->cd(); else gROOT->cd(); |
136 | if (!closestEntry) return NULL; |
137 | return closestEntry; |
138 | } |
139 | |
140 | //_____________________________________________________________________________ |
141 | Bool_t AliRunDataFile::PutEntry(AliRunData* entry) |
142 | { |
143 | // put an object into the data base |
144 | |
145 | if (!entry || !fFile) return kFALSE; |
146 | if (!fFile->IsWritable()) { |
147 | AliError(Form("The data base file was opened in read only mode. " |
148 | "The object %s was not inserted", entry->GetName())); |
149 | return kFALSE; |
150 | } |
151 | TDirectory* saveDir = gDirectory; |
152 | |
153 | // go to or create the directory |
154 | TString name(entry->GetName()); |
155 | while (name.BeginsWith("/")) name.Remove(0); |
156 | TDirectory* dir = fFile; |
157 | Int_t index = -1; |
158 | while ((index = name.Index("/")) >= 0) { |
159 | TString dirName(name(0, index)); |
160 | if ((index > 0) && !dir->Get(dirName)) dir->mkdir(dirName); |
161 | dir->cd(dirName); |
162 | dir = gDirectory; |
163 | name.Remove(0, index+1); |
164 | } |
165 | |
166 | // determine the version number |
167 | Int_t version = 0; |
168 | TKey* key = fFile->GetKey(name); |
169 | if (key) { |
170 | Int_t nCycles = key->GetCycle(); |
171 | for (Int_t iCycle = nCycles; iCycle > 0; iCycle--) { |
172 | key = fFile->GetKey(entry->GetName(), iCycle); |
173 | if (!key) continue; |
174 | AliRunData* oldEntry = (AliRunData*) key->ReadObj(); |
175 | if (!oldEntry) continue; |
176 | if (oldEntry->InheritsFrom(AliRunData::Class())) { |
177 | if (version <= oldEntry->GetMetaData().GetVersion()) { |
178 | version = oldEntry->GetMetaData().GetVersion()+1; |
179 | } |
180 | } |
181 | delete oldEntry; |
182 | } |
183 | } |
184 | entry->SetVersion(version); |
185 | |
186 | Bool_t result = (entry->Write(name) != 0); |
187 | if (saveDir) saveDir->cd(); else gROOT->cd(); |
188 | return result; |
189 | } |