consolidate zero-length arrays (aka struct hack)
[u/mrichter/AliRoot.git] / RAW / AliRawCastorDB.cxx
1 // @(#) $Id$
2 // Author: Fons Rademakers  26/11/99
3
4 /**************************************************************************
5  * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
6  *                                                                        *
7  * Author: The ALICE Off-line Project.                                    *
8  * Contributors are mentioned in the code where appropriate.              *
9  *                                                                        *
10  * Permission to use, copy, modify and distribute this software and its   *
11  * documentation strictly for non-commercial purposes is hereby granted   *
12  * without fee, provided that the above copyright notice appears in all   *
13  * copies and that both the copyright notice and this permission notice   *
14  * appear in the supporting documentation. The authors make no claims     *
15  * about the suitability of this software for any purpose. It is          *
16  * provided "as is" without express or implied warranty.                  *
17  **************************************************************************/
18
19 //////////////////////////////////////////////////////////////////////////
20 //                                                                      //
21 // AliRawCastorDB                                                       //
22 //                                                                      //
23 //////////////////////////////////////////////////////////////////////////
24
25 #include <TSystem.h>
26 #include <TUrl.h>
27
28 #include "AliRawCastorDB.h"
29
30
31 ClassImp(AliRawCastorDB)
32
33
34 //______________________________________________________________________________
35 AliRawCastorDB::AliRawCastorDB(AliRawEventV2 *event,
36                                AliESDEvent *esd,
37                                Int_t compress,
38                                const char* fileName,Int_t basketsize)
39    : AliRawDB(event, esd, compress, fileName, basketsize)
40 {
41    // Create a new raw DB that will be accessed via CASTOR and rootd.
42
43    static int init = 0;
44    if (!init) {
45       // THESE ENVIRONMENT VARIABLES ARE IN PRINCIPLE HARDCODED IN
46       // THE CASTOR CLIENT LIBRARY
47       // however for sanity we check if they are set by the user
48       if (!gSystem->Getenv("RH_HOST"))
49          Error("AliRawRFIODB", "RH_HOST not set");
50       if (!gSystem->Getenv("SVCCLASS"))
51          Error("AliRawRFIODB", "SVCCLASS not set");
52       init = 1;
53    }
54
55 #if ROOT_VERSION_CODE < ROOT_VERSION(5,99,0)
56    if (fRawDB) fRawDB->UseCache(50, 0x200000);  //0x100000 = 1MB)
57 #endif
58 }
59
60 //______________________________________________________________________________
61 const char *AliRawCastorDB::GetFileName() const
62 {
63    // Return filename based on hostname and date and time. This will make
64    // each file unique. Also the directory will be made unique for each
65    // day by adding the date to the fs. Assumes there is always enough
66    // space on the device.
67
68    static TString fname;
69
70    TString fs  = fFS1;
71    TString fsr = fs;
72    fsr.ReplaceAll("castor:", "rfio:");
73    TDatime dt;
74
75    // make a new subdirectory for each day
76    fs += "/adc-";
77    fs += dt.GetDate();
78
79    fsr += "/adc-";
80    fsr += dt.GetDate();
81
82    Long_t id, size, flags, time;
83    if (gSystem->GetPathInfo(fsr, &id, &size, &flags, &time) == 1) {
84       // directory does not exist, create it
85       if (gSystem->mkdir(fsr, kTRUE) == -1) {
86          Error("GetFileName", "cannot create dir %s, using %s", fsr.Data(),
87                fFS1.Data());
88          fs = fFS1;
89       }
90    }
91    // FIXME: should check if fs is a directory
92
93    TString hostname = gSystem->HostName();
94    Int_t pos;
95    if ((pos = hostname.Index(".")) != kNPOS)
96       hostname.Remove(pos);
97
98    fname = fs + "/" + hostname + "_";
99    fname += dt.GetDate();
100    fname += "_";
101    fname += dt.GetTime();
102    fname += ".root";
103
104    return fname;
105 }
106
107 //______________________________________________________________________________
108 Long64_t AliRawCastorDB::Close()
109 {
110    // Close raw CASTOR/rootd DB.
111
112    if (!fRawDB) return 0;
113
114    if (!fRawDB->IsOpen()) return 0;
115
116    fRawDB->cd();
117
118    // Write the tree.
119    Bool_t error = kFALSE;
120    if (fTree)
121      if (fTree->Write() == 0)
122        error = kTRUE;
123    if (fESDTree)
124      if (fESDTree->Write() == 0)
125        error = kTRUE;
126
127    // Close DB, this also deletes the fTree
128    fRawDB->Close();
129
130    fTree = NULL;
131
132    Long64_t filesize = fRawDB->GetEND();
133
134    if (fDeleteFiles) {
135       TUrl u(fRawDB->GetName());
136       gSystem->Exec(Form("rfrm %s", u.GetFile()));
137    }
138
139    delete fRawDB;
140    fRawDB = 0;
141
142    if(!error)
143      return filesize;
144    else
145      return -1;
146 }