#ifndef __SUT_PFILE_H
#define __SUT_PFILE_H
/******************************************************************************/
/* */
/* X r d S u t P F i l e . h h */
/* */
/* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */
/* Produced by Gerri Ganis for CERN */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
#ifndef __XPROTOCOL_H
#include "XProtocol/XProtocol.hh"
#endif
#ifndef __OOUC_HASH__
#include "XrdOuc/XrdOucHash.hh"
#endif
#ifndef __OUC_STRING_H__
#include "XrdOuc/XrdOucString.hh"
#endif
/******************************************************************************/
/* */
/* Interface class to file to store login-related information */
/* */
/******************************************************************************/
#define kFileIDSize 8
#define kDefFileID "XrdIF"
#define kXrdIFVersion 1
#define kOfsFileID 0
#define kOfsVersion 8 // == kFileIDSize (if this changes remember to scale
#define kOfsCtime 12 // accordingly the other offsets ...)
#define kOfsItime 16
#define kOfsEntries 20
#define kOfsIndOfs 24
#define kOfsJnkSiz 28
#define kPFEcreate 0x1
#define kPFEopen 0x2
#define kMaxLockTries 3
enum EPFileErrors {
kPFErrBadInputs,
kPFErrFileAlreadyOpen,
kPFErrNoFile,
kPFErrFileRename,
kPFErrStat,
kPFErrFileOpen,
kPFErrFileNotOpen,
kPFErrLocking,
kPFErrUnlocking,
kPFErrFileLocked,
kPFErrSeek,
kPFErrRead,
kPFErrOutOfMemory,
kPFErrLenMismatch,
kPFErrBadOp
};
class XrdSutPFEntry;
class XrdSutPFEntInd {
public:
char *name;
kXR_int32 nxtofs;
kXR_int32 entofs;
kXR_int32 entsiz;
XrdSutPFEntInd(const char *n = 0,
kXR_int32 no = 0, kXR_int32 eo = 0, kXR_int32 es = 0);
XrdSutPFEntInd(const XrdSutPFEntInd &ei);
virtual ~XrdSutPFEntInd() { if (name) delete[] name; }
kXR_int32 Length() const { return (strlen(name) + 4*sizeof(kXR_int32)); }
void SetName(const char *n = 0);
// Assignement operator
XrdSutPFEntInd &operator=(const XrdSutPFEntInd ei);
};
class XrdSutPFHeader {
public:
char fileID[kFileIDSize];
kXR_int32 version;
kXR_int32 ctime; // time of file change
kXR_int32 itime; // time of index change
kXR_int32 entries;
kXR_int32 indofs;
kXR_int32 jnksiz; // number of unreachable bytes
XrdSutPFHeader(const char *id = " ", kXR_int32 v = 0, kXR_int32 ct = 0,
kXR_int32 it = 0, kXR_int32 ent = 0, kXR_int32 ofs = 0);
XrdSutPFHeader(const XrdSutPFHeader &fh);
virtual ~XrdSutPFHeader() { }
void Print() const;
static kXR_int32 Length() { return (kFileIDSize + 6*sizeof(kXR_int32)); }
};
class XrdSutPFile {
friend class XrdSutPFCache; // for open/close operation;
private:
char *name;
bool valid; // If the file is usable ...
kXR_int32 fFd;
XrdOucHash *fHashTable; // Reflects the file index structure
kXR_int32 fHTutime; // time at which fHashTable was updated
kXR_int32 fError; // last error
XrdOucString fErrStr; // description of last error
// Entry low level access
kXR_int32 WriteHeader(XrdSutPFHeader hd);
kXR_int32 ReadHeader(XrdSutPFHeader &hd);
kXR_int32 WriteInd(kXR_int32 ofs, XrdSutPFEntInd ind);
kXR_int32 ReadInd(kXR_int32 ofs, XrdSutPFEntInd &ind);
kXR_int32 WriteEnt(kXR_int32 ofs, XrdSutPFEntry ent);
kXR_int32 ReadEnt(kXR_int32 ofs, XrdSutPFEntry &ent);
// Reset (set inactive)
kXR_int32 Reset(kXR_int32 ofs, kXR_int32 size);
// Hash table operations
kXR_int32 UpdateHashTable(bool force = 0);
// For errors
kXR_int32 Err(kXR_int32 code, const char *loc,
const char *em1 = 0, const char *em2 = 0);
public:
XrdSutPFile(const char *n, kXR_int32 openmode = kPFEcreate,
kXR_int32 createmode = 0600, bool hashtab = 1);
XrdSutPFile(const XrdSutPFile &f);
virtual ~XrdSutPFile();
// Initialization method
bool Init(const char *n, kXR_int32 openmode = kPFEcreate,
kXR_int32 createmode = 0600, bool hashtab = 1);
// Open/Close operations
kXR_int32 Open(kXR_int32 opt, bool *wasopen = 0,
const char *nam = 0, kXR_int32 createmode = 0600);
kXR_int32 Close(kXR_int32 d = -1);
// File name
const char *Name() const { return (const char *)name; }
// (Un)Successful attachement
bool IsValid() const { return valid; }
// Last error
kXR_int32 LastError() const { return fError; }
const char *LastErrStr() const { return (const char *)fErrStr.c_str(); }
// Update Methods
kXR_int32 RemoveEntry(const char *name);
kXR_int32 RemoveEntry(kXR_int32 ofs);
kXR_int32 RemoveEntries(const char *name, char opt);
kXR_int32 Trim(const char *fbak = 0);
kXR_int32 UpdateHeader(XrdSutPFHeader hd);
kXR_int32 WriteEntry(XrdSutPFEntry ent);
kXR_int32 UpdateCount(const char *nm, int *cnt = 0, int step = 1, bool reset = 0);
kXR_int32 ResetCount(const char *nm) { return UpdateCount(nm,0,0,1); }
kXR_int32 ReadCount(const char *nm, int &cnt) { return UpdateCount(nm,&cnt,0); }
// Access methods
kXR_int32 RetrieveHeader(XrdSutPFHeader &hd);
kXR_int32 ReadEntry(const char *name, XrdSutPFEntry &ent, int opt = 0);
kXR_int32 ReadEntry(kXR_int32 ofs, XrdSutPFEntry &ent);
kXR_int32 SearchEntries(const char *name, char opt,
kXR_int32 *ofs = 0, kXR_int32 nofs = 1);
kXR_int32 SearchSpecialEntries(kXR_int32 *ofs = 0, kXR_int32 nofs = 1);
// Browser
kXR_int32 Browse(void *out = 0);
};
#endif