00001
00002 #ifndef __SUT_PFILE_H
00003 #define __SUT_PFILE_H
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __XPROTOCOL_H
00016 #include <XProtocol/XProtocol.hh>
00017 #endif
00018 #ifndef __OOUC_HASH__
00019 #include <XrdOuc/XrdOucHash.hh>
00020 #endif
00021 #ifndef __OUC_STRING_H__
00022 #include <XrdOuc/XrdOucString.hh>
00023 #endif
00024
00025
00026
00027
00028
00029
00030 #define kFileIDSize 8
00031 #define kDefFileID "XrdIF"
00032 #define kXrdIFVersion 1
00033
00034 #define kOfsFileID 0
00035 #define kOfsVersion 8 // == kFileIDSize (if this changes remember to scale
00036 #define kOfsCtime 12 // accordingly the other offsets ...)
00037 #define kOfsItime 16
00038 #define kOfsEntries 20
00039 #define kOfsIndOfs 24
00040 #define kOfsJnkSiz 28
00041
00042 #define kPFEcreate 0x1
00043 #define kPFEopen 0x2
00044
00045 #define kMaxLockTries 3
00046
00047 enum EPFileErrors {
00048 kPFErrBadInputs,
00049 kPFErrFileAlreadyOpen,
00050 kPFErrNoFile,
00051 kPFErrFileRename,
00052 kPFErrStat,
00053 kPFErrFileOpen,
00054 kPFErrFileNotOpen,
00055 kPFErrLocking,
00056 kPFErrUnlocking,
00057 kPFErrFileLocked,
00058 kPFErrSeek,
00059 kPFErrRead,
00060 kPFErrOutOfMemory,
00061 kPFErrLenMismatch,
00062 kPFErrBadOp
00063 };
00064
00065 class XrdSutPFEntry;
00066
00067 class XrdSutPFEntInd {
00068 public:
00069 char *name;
00070 kXR_int32 nxtofs;
00071 kXR_int32 entofs;
00072 kXR_int32 entsiz;
00073 XrdSutPFEntInd(const char *n = 0,
00074 kXR_int32 no = 0, kXR_int32 eo = 0, kXR_int32 es = 0);
00075 XrdSutPFEntInd(const XrdSutPFEntInd &ei);
00076 virtual ~XrdSutPFEntInd() { if (name) delete[] name; }
00077
00078 kXR_int32 Length() const { return (strlen(name) + 4*sizeof(kXR_int32)); }
00079 void SetName(const char *n = 0);
00080
00081
00082 XrdSutPFEntInd &operator=(const XrdSutPFEntInd ei);
00083 };
00084
00085 class XrdSutPFHeader {
00086 public:
00087 char fileID[kFileIDSize];
00088 kXR_int32 version;
00089 kXR_int32 ctime;
00090 kXR_int32 itime;
00091 kXR_int32 entries;
00092 kXR_int32 indofs;
00093 kXR_int32 jnksiz;
00094 XrdSutPFHeader(const char *id = " ", kXR_int32 v = 0, kXR_int32 ct = 0,
00095 kXR_int32 it = 0, kXR_int32 ent = 0, kXR_int32 ofs = 0);
00096 XrdSutPFHeader(const XrdSutPFHeader &fh);
00097 virtual ~XrdSutPFHeader() { }
00098 void Print() const;
00099
00100 static kXR_int32 Length() { return (kFileIDSize + 6*sizeof(kXR_int32)); }
00101 };
00102
00103
00104 class XrdSutPFile {
00105
00106 friend class XrdSutCache;
00107
00108 private:
00109 char *name;
00110 bool valid;
00111 kXR_int32 fFd;
00112 XrdOucHash<kXR_int32> *fHashTable;
00113 kXR_int32 fHTutime;
00114 kXR_int32 fError;
00115 XrdOucString fErrStr;
00116
00117
00118 kXR_int32 WriteHeader(XrdSutPFHeader hd);
00119 kXR_int32 ReadHeader(XrdSutPFHeader &hd);
00120 kXR_int32 WriteInd(kXR_int32 ofs, XrdSutPFEntInd ind);
00121 kXR_int32 ReadInd(kXR_int32 ofs, XrdSutPFEntInd &ind);
00122 kXR_int32 WriteEnt(kXR_int32 ofs, XrdSutPFEntry ent);
00123 kXR_int32 ReadEnt(kXR_int32 ofs, XrdSutPFEntry &ent);
00124
00125
00126 kXR_int32 Reset(kXR_int32 ofs, kXR_int32 size);
00127
00128
00129 kXR_int32 UpdateHashTable(bool force = 0);
00130
00131
00132 kXR_int32 Err(kXR_int32 code, const char *loc,
00133 const char *em1 = 0, const char *em2 = 0);
00134
00135 public:
00136 XrdSutPFile(const char *n, kXR_int32 openmode = kPFEcreate,
00137 kXR_int32 createmode = 0600, bool hashtab = 1);
00138 XrdSutPFile(const XrdSutPFile &f);
00139 virtual ~XrdSutPFile();
00140
00141
00142 bool Init(const char *n, kXR_int32 openmode = kPFEcreate,
00143 kXR_int32 createmode = 0600, bool hashtab = 1);
00144
00145
00146 kXR_int32 Open(kXR_int32 opt, bool *wasopen = 0,
00147 const char *nam = 0, kXR_int32 createmode = 0600);
00148 kXR_int32 Close(kXR_int32 d = -1);
00149
00150
00151 const char *Name() const { return (const char *)name; }
00152
00153 bool IsValid() const { return valid; }
00154
00155 kXR_int32 LastError() const { return fError; }
00156 const char *LastErrStr() const { return (const char *)fErrStr.c_str(); }
00157
00158
00159 kXR_int32 RemoveEntry(const char *name);
00160 kXR_int32 RemoveEntry(kXR_int32 ofs);
00161 kXR_int32 RemoveEntries(const char *name, char opt);
00162 kXR_int32 Trim(const char *fbak = 0);
00163 kXR_int32 UpdateHeader(XrdSutPFHeader hd);
00164 kXR_int32 WriteEntry(XrdSutPFEntry ent);
00165 kXR_int32 UpdateCount(const char *nm, int *cnt = 0, int step = 1, bool reset = 0);
00166 kXR_int32 ResetCount(const char *nm) { return UpdateCount(nm,0,0,1); }
00167 kXR_int32 ReadCount(const char *nm, int &cnt) { return UpdateCount(nm,&cnt,0); }
00168
00169
00170 kXR_int32 RetrieveHeader(XrdSutPFHeader &hd);
00171 kXR_int32 ReadEntry(const char *name, XrdSutPFEntry &ent, int opt = 0);
00172 kXR_int32 ReadEntry(kXR_int32 ofs, XrdSutPFEntry &ent);
00173 kXR_int32 SearchEntries(const char *name, char opt,
00174 kXR_int32 *ofs = 0, kXR_int32 nofs = 1);
00175 kXR_int32 SearchSpecialEntries(kXR_int32 *ofs = 0, kXR_int32 nofs = 1);
00176
00177
00178 kXR_int32 Browse(void *out = 0);
00179 };
00180
00181 #endif