bool S3ObjList::insert()

in src/s3objlist.cpp [38:119]


bool S3ObjList::insert(const char* name, const char* etag, bool is_dir, const char* size, const char* last_modified)
{
    if(!name || '\0' == name[0]){
        return false;
    }

    s3obj_t::iterator iter;
    std::string newname;
    std::string orgname = name;

    // Normalization
    std::string::size_type pos = orgname.find("_$folder$");
    if(std::string::npos != pos){
        newname = orgname.substr(0, pos);
        is_dir  = true;
    }else{
        newname = orgname;
    }
    if(is_dir){
        if('/' != *newname.rbegin()){
            newname += "/";
        }
    }else{
        if('/' == *newname.rbegin()){
            is_dir = true;
        }
    }

    // Check derived name object.
    if(is_dir){
        std::string chkname = newname.substr(0, newname.length() - 1);
        if(objects.end() != (iter = objects.find(chkname))){
            // found "dir" object --> remove it.
            S3FS_PRN_DBG("Type Conflict[%s and %s may exist on the cloud at the same time.]", chkname.c_str(), newname.c_str());
            objects.erase(iter);
        }
    }else{
        std::string chkname = newname + "/";
        if(objects.end() != (iter = objects.find(chkname))){
            // found "dir/" object --> not add new object.
            // and add normalization
            return insert_normalized(orgname.c_str(), chkname.c_str(), true);
        }
    }

    // Add object
    if(objects.end() != (iter = objects.find(newname))){
        // Found same object --> update information.
        (*iter).second.normalname.erase();
        (*iter).second.orgname = orgname;
        (*iter).second.is_dir  = is_dir;
        if(etag){
            (*iter).second.etag = std::string(etag);  // over write
        }
        if(size){
            (*iter).second.size = size;
        }
        if(last_modified){
            (*iter).second.lastmodified = last_modified;
        }
    }else{
        // add new object
        s3obj_entry newobject;
        newobject.orgname = orgname;
        newobject.is_dir  = is_dir;
        if(etag){
            newobject.etag = etag;
        }
        if(size){
            newobject.size = size;
        }
        if(last_modified){
            newobject.lastmodified = last_modified;
        }
        objects[newname] = newobject;

        S3FS_PRN_INFO("add new object[path=%s, size=%s, is_dir:%d]", orgname.c_str(), newobject.size.c_str(), is_dir);
    }

    // add normalization
    return insert_normalized(orgname.c_str(), newname.c_str(), is_dir);
}