Commit 78470a2c authored by Marc Vef's avatar Marc Vef
Browse files

Writing/reading specific mdata fields is now possible

parent 7b257761
Loading
Loading
Loading
Loading
+83 −0
Original line number Diff line number Diff line
@@ -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);
+17 −7
Original line number Diff line number Diff line
@@ -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) {