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