ROOT logo
// @(#)root/dcache:$Id: TDCacheFile.h 26186 2008-11-14 09:33:41Z rdm $
// Author: Grzegorz Mazur   20/01/2002
// Updated: William Tanenbaum 21/11/2003
// Updated: Tgiran Mkrtchyan 28/06/2004

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TDCacheFile
#define ROOT_TDCacheFile


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TDCacheFile                                                          //
//                                                                      //
// A TDCacheFile is like a normal TFile except that it reads and writes //
// its data via a dCache server.                                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#ifndef ROOT_TFile
#include "TFile.h"
#endif
#ifndef ROOT_TSystem
#include "TSystem.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif

#include <sys/stat.h>

#define RAHEAD_BUFFER_SIZE 8192

class TDCacheFile : public TFile {

private:
   Bool_t fStatCached;       //! (transient) is file status cached?
   struct stat64 fStatBuffer;  //! (transient) Cached file status buffer (for performance)

   TDCacheFile() : fStatCached(kFALSE) { }

   // Interface to basic system I/O routines
   Int_t    SysOpen(const char *pathname, Int_t flags, UInt_t mode);
   Int_t    SysClose(Int_t fd);
   Int_t    SysRead(Int_t fd, void *buf, Int_t len);
   Int_t    SysWrite(Int_t fd, const void *buf, Int_t len);
   Long64_t SysSeek(Int_t fd, Long64_t offset, Int_t whence);
   Int_t    SysStat(Int_t fd, Long_t *id, Long64_t *size, Long_t *flags, Long_t *modtime);
   Int_t    SysSync(Int_t fd);

public:
   TDCacheFile(const char *path, Option_t *option="",
               const char *ftitle="", Int_t compress=1);

   ~TDCacheFile();

   Bool_t  ReadBuffer(char *buf, Int_t len);
   Bool_t  WriteBuffer(const char *buf, Int_t len);

   Bool_t  ReadBuffers(char *buf, Long64_t *pos, Int_t *len, Int_t nbuf);

   void    ResetErrno() const;

   static Bool_t Stage(const char *path, UInt_t secs,
                       const char *location = 0);
   static Bool_t CheckFile(const char *path, const char *location = 0);

   // Note: This must be kept in sync with values #defined in dcap.h
   enum OnErrorAction {
      kOnErrorRetry   =  1,
      kOnErrorFail    =  0,
      kOnErrorDefault = -1
   };

   static void SetOpenTimeout(UInt_t secs);
   static void SetOnError(OnErrorAction = kOnErrorDefault);

   static void SetReplyHostName(const char *host_name);
   static const char *GetDcapVersion();
   static TString GetDcapPath(const char *path);


   ClassDef(TDCacheFile,1)  //A ROOT file that reads/writes via a dCache server
};


class TDCacheSystem : public TSystem {

private:
   void    *fDirp;   // directory handler

   void    *GetDirPtr() const { return fDirp; }

public:
   TDCacheSystem();
   virtual ~TDCacheSystem() { }

   Int_t       MakeDirectory(const char *name);
   void       *OpenDirectory(const char *name);
   void        FreeDirectory(void *dirp);
   const char *GetDirEntry(void *dirp);
   Int_t       GetPathInfo(const char *path, FileStat_t &buf);
   Bool_t      AccessPathName(const char *path, EAccessMode mode);

   ClassDef(TDCacheSystem,0)  // Directory handler for DCache
};

#endif
 TDCacheFile.h:1
 TDCacheFile.h:2
 TDCacheFile.h:3
 TDCacheFile.h:4
 TDCacheFile.h:5
 TDCacheFile.h:6
 TDCacheFile.h:7
 TDCacheFile.h:8
 TDCacheFile.h:9
 TDCacheFile.h:10
 TDCacheFile.h:11
 TDCacheFile.h:12
 TDCacheFile.h:13
 TDCacheFile.h:14
 TDCacheFile.h:15
 TDCacheFile.h:16
 TDCacheFile.h:17
 TDCacheFile.h:18
 TDCacheFile.h:19
 TDCacheFile.h:20
 TDCacheFile.h:21
 TDCacheFile.h:22
 TDCacheFile.h:23
 TDCacheFile.h:24
 TDCacheFile.h:25
 TDCacheFile.h:26
 TDCacheFile.h:27
 TDCacheFile.h:28
 TDCacheFile.h:29
 TDCacheFile.h:30
 TDCacheFile.h:31
 TDCacheFile.h:32
 TDCacheFile.h:33
 TDCacheFile.h:34
 TDCacheFile.h:35
 TDCacheFile.h:36
 TDCacheFile.h:37
 TDCacheFile.h:38
 TDCacheFile.h:39
 TDCacheFile.h:40
 TDCacheFile.h:41
 TDCacheFile.h:42
 TDCacheFile.h:43
 TDCacheFile.h:44
 TDCacheFile.h:45
 TDCacheFile.h:46
 TDCacheFile.h:47
 TDCacheFile.h:48
 TDCacheFile.h:49
 TDCacheFile.h:50
 TDCacheFile.h:51
 TDCacheFile.h:52
 TDCacheFile.h:53
 TDCacheFile.h:54
 TDCacheFile.h:55
 TDCacheFile.h:56
 TDCacheFile.h:57
 TDCacheFile.h:58
 TDCacheFile.h:59
 TDCacheFile.h:60
 TDCacheFile.h:61
 TDCacheFile.h:62
 TDCacheFile.h:63
 TDCacheFile.h:64
 TDCacheFile.h:65
 TDCacheFile.h:66
 TDCacheFile.h:67
 TDCacheFile.h:68
 TDCacheFile.h:69
 TDCacheFile.h:70
 TDCacheFile.h:71
 TDCacheFile.h:72
 TDCacheFile.h:73
 TDCacheFile.h:74
 TDCacheFile.h:75
 TDCacheFile.h:76
 TDCacheFile.h:77
 TDCacheFile.h:78
 TDCacheFile.h:79
 TDCacheFile.h:80
 TDCacheFile.h:81
 TDCacheFile.h:82
 TDCacheFile.h:83
 TDCacheFile.h:84
 TDCacheFile.h:85
 TDCacheFile.h:86
 TDCacheFile.h:87
 TDCacheFile.h:88
 TDCacheFile.h:89
 TDCacheFile.h:90
 TDCacheFile.h:91
 TDCacheFile.h:92
 TDCacheFile.h:93
 TDCacheFile.h:94
 TDCacheFile.h:95
 TDCacheFile.h:96
 TDCacheFile.h:97
 TDCacheFile.h:98
 TDCacheFile.h:99
 TDCacheFile.h:100
 TDCacheFile.h:101
 TDCacheFile.h:102
 TDCacheFile.h:103
 TDCacheFile.h:104
 TDCacheFile.h:105
 TDCacheFile.h:106
 TDCacheFile.h:107
 TDCacheFile.h:108
 TDCacheFile.h:109
 TDCacheFile.h:110
 TDCacheFile.h:111
 TDCacheFile.h:112
 TDCacheFile.h:113
 TDCacheFile.h:114
 TDCacheFile.h:115
 TDCacheFile.h:116