00001
00002
00003
00004 #ifndef DMLITE_CPP_INODE_H
00005 #define DMLITE_CPP_INODE_H
00006
00007 #include "../common/config.h"
00008 #include "base.h"
00009 #include "exceptions.h"
00010 #include "utils/extensible.h"
00011 #include "utils/security.h"
00012
00013 #include <dirent.h>
00014 #include <utime.h>
00015 #include <string>
00016 #include <vector>
00017
00018 namespace dmlite {
00019
00020
00021 class StackInstance;
00022
00023
00024 struct IDirectory { virtual ~IDirectory(); };
00025
00026
00027 struct ExtendedStat: public Extensible {
00028 enum FileStatus { kOnline = '-',
00029 kMigrated = 'm'
00030 };
00031
00032 ino_t parent;
00033 struct ::stat stat;
00034 FileStatus status;
00035 std::string name;
00036 std::string guid;
00037 std::string csumtype;
00038 std::string csumvalue;
00039 Acl acl;
00040
00041 bool operator == (const ExtendedStat&) const;
00042 bool operator != (const ExtendedStat&) const;
00043 bool operator < (const ExtendedStat&) const;
00044 bool operator > (const ExtendedStat&) const;
00045 };
00046
00047
00048 struct SymLink: public Extensible {
00049 ino_t inode;
00050 std::string link;
00051
00052 bool operator == (const SymLink&) const;
00053 bool operator != (const SymLink&) const;
00054 bool operator < (const SymLink&) const;
00055 bool operator > (const SymLink&) const;
00056 };
00057
00058
00059 struct Replica: public Extensible {
00060 enum ReplicaStatus { kAvailable = '-',
00061 kBeingPopulated = 'P',
00062 kToBeDeleted = 'D'
00063 };
00064 enum ReplicaType { kVolatile = 'V',
00065 kPermanent = 'P'
00066 };
00067
00068 int64_t replicaid;
00069 int64_t fileid;
00070
00071 int64_t nbaccesses;
00072 time_t atime;
00073 time_t ptime;
00074 time_t ltime;
00075
00076 ReplicaStatus status;
00077 ReplicaType type;
00078
00079 std::string server;
00080 std::string rfn;
00081
00082 bool operator == (const Replica&) const;
00083 bool operator != (const Replica&) const;
00084 bool operator < (const Replica&) const;
00085 bool operator > (const Replica&) const;
00086 };
00087
00088
00089
00090 class INode: public virtual BaseInterface {
00091 public:
00092
00093 virtual ~INode();
00094
00095
00096 virtual void begin(void) throw (DmException);
00097
00098
00099 virtual void commit(void) throw (DmException);
00100
00101
00102 virtual void rollback(void) throw (DmException);
00103
00104
00105
00106
00107 virtual ExtendedStat create(const ExtendedStat& f) throw (DmException);
00108
00109
00110
00111
00112
00113 virtual void symlink(ino_t inode, const std::string &link) throw (DmException);
00114
00115
00116
00117
00118
00119
00120 virtual void unlink(ino_t inode) throw (DmException);
00121
00122
00123
00124
00125 virtual void move(ino_t inode, ino_t dest) throw (DmException);
00126
00127
00128
00129
00130 virtual void rename(ino_t inode, const std::string& name) throw (DmException);
00131
00132
00133
00134
00135 virtual ExtendedStat extendedStat(ino_t inode) throw (DmException);
00136
00137
00138
00139
00140
00141 virtual ExtendedStat extendedStat(ino_t parent,
00142 const std::string& name) throw (DmException);
00143
00144
00145
00146 virtual ExtendedStat extendedStat(const std::string& guid) throw (DmException);
00147
00148
00149
00150
00151
00152 virtual SymLink readLink(ino_t inode) throw (DmException);
00153
00154
00155
00156
00157 virtual void addReplica(const Replica& replica) throw (DmException);
00158
00159
00160
00161 virtual void deleteReplica(const Replica& replica) throw (DmException);
00162
00163
00164
00165 virtual Replica getReplica(int64_t rid) throw (DmException);
00166
00167
00168
00169 virtual Replica getReplica(const std::string& rfn) throw (DmException);
00170
00171
00172
00173 virtual void updateReplica(const Replica& replica) throw (DmException);
00174
00175
00176
00177 virtual std::vector<Replica> getReplicas(ino_t inode) throw (DmException);
00178
00179
00180
00181
00182 virtual void utime(ino_t inode,
00183 const struct utimbuf* buf) throw (DmException);
00184
00185
00186
00187
00188
00189
00190
00191
00192 virtual void setMode(ino_t inode, uid_t uid, gid_t gid, mode_t mode,
00193 const Acl& acl) throw (DmException);
00194
00195
00196
00197
00198 virtual void setSize(ino_t inode, size_t size) throw (DmException);
00199
00200
00201
00202
00203
00204 virtual void setChecksum(ino_t inode, const std::string& csumtype,
00205 const std::string& csumvalue) throw (DmException);
00206
00207
00208
00209
00210 virtual std::string getComment(ino_t inode) throw (DmException);
00211
00212
00213
00214
00215 virtual void setComment(ino_t inode,
00216 const std::string& comment) throw (DmException);
00217
00218
00219
00220 virtual void deleteComment(ino_t inode) throw (DmException);
00221
00222
00223
00224
00225 virtual void setGuid(ino_t inode,
00226 const std::string& guid) throw (DmException);
00227
00228
00229
00230 virtual void updateExtendedAttributes(ino_t inode,
00231 const Extensible& attr) throw (DmException);
00232
00233
00234
00235
00236 virtual IDirectory* openDir(ino_t inode) throw (DmException);
00237
00238
00239
00240 virtual void closeDir(IDirectory* dir) throw (DmException);
00241
00242
00243
00244
00245 virtual ExtendedStat* readDirx(IDirectory* dir) throw (DmException);
00246
00247
00248
00249
00250 virtual struct dirent* readDir (IDirectory* dir) throw (DmException);
00251 };
00252
00253
00254 class INodeFactory: public virtual BaseFactory {
00255 public:
00256
00257 virtual ~INodeFactory();
00258
00259 protected:
00260
00261 friend class StackInstance;
00262
00263
00264 static INode* createINode(INodeFactory* factory,
00265 PluginManager* pm) throw (DmException);
00266
00267
00268 virtual INode* createINode(PluginManager* pm) throw (DmException);
00269 };
00270
00271 };
00272
00273 #endif // DMLITE_CPP_INODE_H