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