Verified Commit 3fbe4e36 authored by Tommaso Tocci's avatar Tommaso Tocci
Browse files

Use char as metadata separator instead of string

parent 712421cc
Loading
Loading
Loading
Loading
+19 −19
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@

using namespace std;

static const std::string dentry_val_delim = ","s;
static const char MSP = '|'; // metadata separator

// By default create an empty metadata object

@@ -36,7 +36,7 @@ Metadata::Metadata(const std::string& path, const mode_t mode) : atime_(),
 * @param db_val
 */
Metadata::Metadata(const std::string& path, std::string db_val) {
    auto pos = db_val.find(dentry_val_delim);
    auto pos = db_val.find(MSP);
    if (pos == std::string::npos) { // no delimiter found => no metadata enabled. fill with dummy values
        inode_no_ = std::hash<std::string>{}(path);
        mode_ = static_cast<unsigned int>(stoul(db_val));
@@ -54,7 +54,7 @@ Metadata::Metadata(const std::string& path, std::string db_val) {
    mode_ = static_cast<unsigned int>(stoul(db_val.substr(0, pos)));
    db_val.erase(0, pos + 1);
    // size is also there
    pos = db_val.find(dentry_val_delim);
    pos = db_val.find(MSP);
    if (pos != std::string::npos) {  // delimiter found. more metadata is coming
        size_ = stol(db_val.substr(0, pos));
        db_val.erase(0, pos + 1);
@@ -64,37 +64,37 @@ Metadata::Metadata(const std::string& path, std::string db_val) {
    }
    // The order is important. don't change.
    if (ADAFS_DATA->atime_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        atime_ = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->mtime_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        mtime_ = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->ctime_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        ctime_ = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->uid_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        uid_ = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->gid_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        gid_ = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->inode_no_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        inode_no_ = static_cast<ino_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->link_cnt_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        link_count_ = static_cast<nlink_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
@@ -129,38 +129,38 @@ std::string Metadata::serialize() const {
    std::string s;
    // The order is important. don't change.
    s += std::to_string(mode_); // add mandatory mode
    s += dentry_val_delim;
    s += MSP;
    s += std::to_string(size_); // add mandatory size
    if (ADAFS_DATA->atime_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(atime_);
    }
    if (ADAFS_DATA->mtime_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(mtime_);
    }
    if (ADAFS_DATA->ctime_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(ctime_);
    }
    if (ADAFS_DATA->uid_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(uid_);
    }
    if (ADAFS_DATA->gid_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(gid_);
    }
    if (ADAFS_DATA->inode_no_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(inode_no_);
    }
    if (ADAFS_DATA->link_cnt_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(link_count_);
    }
    if (ADAFS_DATA->blocks_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += std::to_string(blocks_);
    }
    return s;
+10 −10
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@

using namespace std;

static const std::string dentry_val_delim = ","s;
static const char MSP = '|';

bool is_fs_path(const char* path) {
    return strstr(path, CTX->mountdir().c_str()) == path;
@@ -43,7 +43,7 @@ int db_val_to_stat(const std::string& path, std::string db_val, struct stat& att
    memset(&attr.st_mtim, 0, sizeof(timespec));
    memset(&attr.st_ctim, 0, sizeof(timespec));

    auto pos = db_val.find(dentry_val_delim);
    auto pos = db_val.find(MSP);
    if (pos == std::string::npos) { // no delimiter found => no metadata enabled. fill with dummy values
        attr.st_mode = static_cast<unsigned int>(stoul(db_val));
        attr.st_nlink = 1;
@@ -61,7 +61,7 @@ int db_val_to_stat(const std::string& path, std::string db_val, struct stat& att
    attr.st_mode = static_cast<unsigned int>(stoul(db_val.substr(0, pos)));
    db_val.erase(0, pos + 1);
    // size is also there XXX
    pos = db_val.find(dentry_val_delim);
    pos = db_val.find(MSP);
    if (pos != std::string::npos) {  // delimiter found. more metadata is coming
        attr.st_size = stol(db_val.substr(0, pos));
        db_val.erase(0, pos + 1);
@@ -70,37 +70,37 @@ int db_val_to_stat(const std::string& path, std::string db_val, struct stat& att
    }
    // The order is important. don't change.
    if (CTX->fs_conf()->atime_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_atim.tv_sec = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->mtime_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_mtim.tv_sec = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->ctime_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_ctim.tv_sec = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->uid_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_uid = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->gid_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_gid = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->inode_no_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_ino = static_cast<ino_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->link_cnt_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_nlink = static_cast<nlink_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }