Loading lfs/src/adafs_ops/mdata_ops.hpp +83 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,89 @@ using namespace std; /** * Reads a specific metadata field to the database * @tparam T * @param inode * @param field * @return type, 0 might mean failure */ template<typename T> decltype(auto) read_metadata_field(const fuse_ino_t inode, Md_fields field) { // XXX I am sure this can be implemented in a better way switch (field) { case Md_fields::atime: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::atime)>(md_field_map))); case Md_fields::mtime: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mtime)>(md_field_map))); case Md_fields::ctime: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::ctime)>(md_field_map))); case Md_fields::uid: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::uid)>(md_field_map))); case Md_fields::gid: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::gid)>(md_field_map))); case Md_fields::mode: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mode)>(md_field_map))); case Md_fields::inode_no: return db_get_mdata<T>( db_build_mdata_key(inode, std::get<to_underlying(Md_fields::inode_no)>(md_field_map))); case Md_fields::link_count: return db_get_mdata<T>( db_build_mdata_key(inode, std::get<to_underlying(Md_fields::link_count)>(md_field_map))); case Md_fields::size: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::size)>(md_field_map))); case Md_fields::blocks: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::blocks)>(md_field_map))); } } /** * writes a specific metadata field to the database * @tparam T * @param inode * @param field * @param md * @return bool - success */ template<typename T> bool write_metadata_field(const fuse_ino_t inode, const Md_fields field, Metadata& md) { // XXX I am sure this can be implemented in a better way switch (field) { case Md_fields::atime: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::atime)>(md_field_map)), md.atime()); case Md_fields::mtime: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mtime)>(md_field_map)), md.mtime()); case Md_fields::ctime: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::ctime)>(md_field_map)), md.ctime()); case Md_fields::uid: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::uid)>(md_field_map)), md.uid()); case Md_fields::gid: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::gid)>(md_field_map)), md.gid()); case Md_fields::mode: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mode)>(md_field_map)), md.mode()); case Md_fields::inode_no: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::inode_no)>(md_field_map)), md.inode_no()); case Md_fields::link_count: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::link_count)>(md_field_map)), md.link_count()); case Md_fields::size: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::size)>(md_field_map)), md.size()); case Md_fields::blocks: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::blocks)>(md_field_map)), md.blocks()); } } int write_all_metadata(const Metadata& md); int read_all_metadata(Metadata& md, const fuse_ino_t inode); Loading lfs/src/db/db_ops.cpp +17 −7 Original line number Diff line number Diff line Loading @@ -7,26 +7,36 @@ using namespace rocksdb; using namespace std; inline const string db_get_mdata_helper(const string& key) { inline const bool db_get_mdata_helper(const string& key, string& val) { auto db = ADAFS_DATA->rdb(); string val_str; db->Get(ReadOptions(), key, &val_str); return val_str; return db->Get(ReadOptions(), key, &val).ok(); } template<> unsigned long db_get_mdata<unsigned long>(const string& key) { return stoul(db_get_mdata_helper(key)); string val; if (db_get_mdata_helper(key, val)) return stoul(val); else return 0; } template<> long db_get_mdata<long>(const string& key) { return stol(db_get_mdata_helper(key)); string val; if (db_get_mdata_helper(key, val)) return stol(val); else return 0; } template<> unsigned int db_get_mdata<unsigned int>(const string& key) { return static_cast<unsigned int>(stoul(db_get_mdata_helper(key))); string val; if (db_get_mdata_helper(key, val)) return static_cast<unsigned int>(stoul(val)); else return 0; } bool db_delete_mdata(const string& key) { Loading Loading
lfs/src/adafs_ops/mdata_ops.hpp +83 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,89 @@ using namespace std; /** * Reads a specific metadata field to the database * @tparam T * @param inode * @param field * @return type, 0 might mean failure */ template<typename T> decltype(auto) read_metadata_field(const fuse_ino_t inode, Md_fields field) { // XXX I am sure this can be implemented in a better way switch (field) { case Md_fields::atime: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::atime)>(md_field_map))); case Md_fields::mtime: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mtime)>(md_field_map))); case Md_fields::ctime: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::ctime)>(md_field_map))); case Md_fields::uid: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::uid)>(md_field_map))); case Md_fields::gid: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::gid)>(md_field_map))); case Md_fields::mode: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mode)>(md_field_map))); case Md_fields::inode_no: return db_get_mdata<T>( db_build_mdata_key(inode, std::get<to_underlying(Md_fields::inode_no)>(md_field_map))); case Md_fields::link_count: return db_get_mdata<T>( db_build_mdata_key(inode, std::get<to_underlying(Md_fields::link_count)>(md_field_map))); case Md_fields::size: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::size)>(md_field_map))); case Md_fields::blocks: return db_get_mdata<T>(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::blocks)>(md_field_map))); } } /** * writes a specific metadata field to the database * @tparam T * @param inode * @param field * @param md * @return bool - success */ template<typename T> bool write_metadata_field(const fuse_ino_t inode, const Md_fields field, Metadata& md) { // XXX I am sure this can be implemented in a better way switch (field) { case Md_fields::atime: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::atime)>(md_field_map)), md.atime()); case Md_fields::mtime: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mtime)>(md_field_map)), md.mtime()); case Md_fields::ctime: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::ctime)>(md_field_map)), md.ctime()); case Md_fields::uid: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::uid)>(md_field_map)), md.uid()); case Md_fields::gid: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::gid)>(md_field_map)), md.gid()); case Md_fields::mode: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::mode)>(md_field_map)), md.mode()); case Md_fields::inode_no: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::inode_no)>(md_field_map)), md.inode_no()); case Md_fields::link_count: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::link_count)>(md_field_map)), md.link_count()); case Md_fields::size: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::size)>(md_field_map)), md.size()); case Md_fields::blocks: return db_put_mdata(db_build_mdata_key(inode, std::get<to_underlying(Md_fields::blocks)>(md_field_map)), md.blocks()); } } int write_all_metadata(const Metadata& md); int read_all_metadata(Metadata& md, const fuse_ino_t inode); Loading
lfs/src/db/db_ops.cpp +17 −7 Original line number Diff line number Diff line Loading @@ -7,26 +7,36 @@ using namespace rocksdb; using namespace std; inline const string db_get_mdata_helper(const string& key) { inline const bool db_get_mdata_helper(const string& key, string& val) { auto db = ADAFS_DATA->rdb(); string val_str; db->Get(ReadOptions(), key, &val_str); return val_str; return db->Get(ReadOptions(), key, &val).ok(); } template<> unsigned long db_get_mdata<unsigned long>(const string& key) { return stoul(db_get_mdata_helper(key)); string val; if (db_get_mdata_helper(key, val)) return stoul(val); else return 0; } template<> long db_get_mdata<long>(const string& key) { return stol(db_get_mdata_helper(key)); string val; if (db_get_mdata_helper(key, val)) return stol(val); else return 0; } template<> unsigned int db_get_mdata<unsigned int>(const string& key) { return static_cast<unsigned int>(stoul(db_get_mdata_helper(key))); string val; if (db_get_mdata_helper(key, val)) return static_cast<unsigned int>(stoul(val)); else return 0; } bool db_delete_mdata(const string& key) { Loading