00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00014
00015 #include <string>
00016 #include "TEnv.h"
00017
00018 #include "Persistency/PerFileManager.h"
00019 #include "Persistency/PerFile.h"
00020 #include "MessageService/MsgService.h"
00021
00022 std::ostream& operator<<(std::ostream& ms, const PerFileManager& fm)
00023 {
00024 return fm.Print(ms);
00025 }
00026
00027 ClassImp(PerFileManager)
00028
00029
00030
00031
00032 CVSID("$Id: PerFileManager.cxx,v 1.12 2005/09/25 19:25:52 schubert Exp $");
00033
00034 PerFileManager* PerFileManager::fgInstance = 0;
00035
00036
00037
00038
00039
00040
00041 const PerFile* PerFileManager::ChangeFile(std::string oldfilepathname,
00042 std::string newfilepathname,TFile* newfileptr) {
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 FileMapItr itr = fFileMap.find(oldfilepathname);
00064
00065 if ( itr == fFileMap.end() ) {
00066
00067 FileMapItr newItr = fFileMap.find(newfilepathname);
00068 if ( newItr == fFileMap.end() ) {
00069 MSG("Per",Msg::kWarning) << "ChangeFile unable to find old file "
00070 << oldfilepathname << " or new file " << newfilepathname
00071 << " in file map." << endl;
00072 return (PerFile*)0;
00073 }
00074 else return itr->second;
00075 }
00076
00077
00078 PerFile* perFile = itr->second;
00079 perFile -> ChangeFile(newfilepathname,newfileptr);
00080
00081 fFileMap.erase(itr);
00082 fFileMap[newfilepathname] = perFile;
00083
00084 return perFile;
00085
00086 }
00087
00088 void PerFileManager::CloseAll() {
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 for (FileMapItr itr = fFileMap.begin(); itr != fFileMap.end(); ++itr) {
00102 PerFile *file = itr -> second;
00103 file -> Close(true);
00104 delete file;
00105 }
00106 fFileMap.clear();
00107
00108 }
00109
00110 void PerFileManager::CloseFile(string fullfilepathname) {
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 FileMapItr itr = fFileMap.find(fullfilepathname);
00123 if (itr != fFileMap.end()) {
00124 UInt_t clientsleft = (itr -> second) -> Close();
00125 if(clientsleft <= 0) {
00126
00127 delete (itr->second);
00128 fFileMap.erase(itr);
00129 }
00130 }
00131 else {
00132 MSG("Per",Msg::kInfo) << "Unable to close file " << fullfilepathname <<
00133 ". File was not opened by PerFileManager. " << endl;
00134 }
00135
00136 }
00137
00138
00139 const PerFile* PerFileManager::GetOpenedFile(string fullfilepathname) const {
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 FileMapConstItr citr = fFileMap.find(fullfilepathname);
00154 return (citr != fFileMap.end()) ? citr -> second : (PerFile*)0;
00155
00156 }
00157
00158 PerFileManager& PerFileManager::Instance() {
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 static Cleaner cleaner;
00170 if (fgInstance == 0) {
00171 cleaner.UseMe();
00172 fgInstance = new PerFileManager();
00173 }
00174 return *fgInstance;
00175
00176 }
00177
00178
00179 const PerFile* PerFileManager::OpenFile(string fullfilepathname, Per::EAccessMode accessmode) {
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 bool openok = false;
00215
00216 fErrorCode = Per::kErrSuccess;
00217
00218 PerFile* file = fFileMap[fullfilepathname];
00219 if (!file) {
00220
00221 file = new PerFile(fullfilepathname,accessmode);
00222 fFileMap[fullfilepathname] = file;
00223 if(!file || !file -> IsOpen()) {
00224 fErrorCode = Per::kErrFileError;
00225 if (file) {
00226 fErrorCode = file -> GetErrorCode();
00227 delete file; file = 0;
00228 }
00229 #ifndef IRIX6
00230 fFileMap.erase(fullfilepathname);
00231 #else
00232
00233 FileMapItr itr = fFileMap.find(fullfilepathname);
00234 fFileMap.erase(itr);
00235 #endif
00236 }
00237 else {
00238 openok = true;
00239 }
00240 }
00241 else {
00242
00243
00244 openok = file -> AddNewClient(accessmode);
00245 if (!openok) fErrorCode = Per::kErrFileConflict;
00246 }
00247
00248 return (openok) ? file : (PerFile*)0;
00249
00250 }
00251
00252 PerFileManager::PerFileManager() : fErrorCode(Per::kErrSuccess) {
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 gEnv -> SetValue("TFile.ForceRemote",1);
00267
00268 }
00269
00270 PerFileManager::~PerFileManager() {
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 CloseAll();
00282
00283 }
00284
00285 std::ostream& PerFileManager::Print(std::ostream& ms) const {
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 ms << "Number of files currently open = " << GetNumFile() << "." << endl;
00297
00298 int ifile=0;
00299 for (FileMapConstItr itr = fFileMap.begin(); itr != fFileMap.end(); ++itr) {
00300 ms << ++ifile << ")" << itr -> second;
00301 }
00302
00303 return ms;
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328