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);
}