/* leaves properties change dialog after changing file attributes */ static void cmd_return(key_info_t key_info, keys_info_t *keys_info) { if(changed) { set_attrs(view, attrs, origin_attrs); leave_attr_mode(); } }
/* leaves properties change dialog after changing file attributes */ static void cmd_ctrl_m(key_info_t key_info, keys_info_t *keys_info) { char path[PATH_MAX]; if(!changed) return; snprintf(path, sizeof(path), "%s/%s", view->curr_dir, view->dir_entry[view->list_pos].name); set_attrs(view, attrs, origin_attrs); leave_attr_mode(); }
bool session::del(const char* name) { // 直接操作后端 cache 服务器,删除属性字段 if (get_attrs(attrs_) == false) return true; std::map<string, session_string>::iterator it = attrs_.find(name); if (it == attrs_.end()) return false; // 先删除并释放对应的对象 attrs_.erase(it); // 如果 sid 中已经没有了数据,则应该将 sid 对象从 memcached 中删除 if (attrs_.empty()) { // 调用虚函数,删除该 sid 对应的缓存内容 if (remove() == false) { logger_error("del sid(%s) error", sid_.c_str()); return false; } return true; } // 重新添加剩余的数据 if (set_attrs(attrs_) == false) { logger_error("set cache error, sid(%s)", sid_.c_str()); attrs_clear(attrs_); // 清除属性集合数据 return false; } attrs_clear(attrs_); // 清除属性集合数据 return true; }
bool session::set(const char* name, const void* value, size_t len) { // 直接操作后端 cache 服务器,设置(添加/修改) 属性字段 // 调用纯虚接口,获得原来的 sid 数据 if (get_attrs(attrs_) == false) { session_string ss(len); ss.copy(value, len); ss.todo_ = TODO_SET; attrs_cache_.insert(std::make_pair(string(name), ss)); } // 如果存在对应 sid 的数据,则将新数据添加在原来数据中 else { if (!sid_saved_) sid_saved_ = true; // 如果该属性已存在,则需要先释放原来的属性值后再添加新值 session_string ss(len); ss.copy(value, len); ss.todo_ = TODO_SET; attrs_cache_.insert(std::make_pair(string(name), ss)); } // 调用纯虚接口,向 memcached 或类似缓存中添加数据 if (set_attrs(attrs_) == false) { logger_error("set cache error, sid(%s)", sid_.c_str()); attrs_clear(attrs_); // 清除属性集合数据 return false; } attrs_clear(attrs_); // 清除属性集合数据 if (!sid_saved_) sid_saved_ = true; return true; }
bool session::flush() { if (!dirty_) return true; dirty_ = false; // 调用纯虚接口,获得原来的 sid 数据 if (get_attrs(attrs_) == true) { if (!sid_saved_) sid_saved_ = true; } std::map<string, session_string>::iterator it_cache = attrs_cache_.begin(); for (; it_cache != attrs_cache_.end(); ++it_cache) { // 如果该属性已存在,则需要先释放原来的属性值后再添加新值 std::map<string, session_string>::iterator it_attr = attrs_.find(it_cache->first); if (it_attr == attrs_.end()) { if (it_cache->second.todo_ == TODO_SET) attrs_.insert(std::make_pair(it_cache->first, it_cache->second)); } else if (it_cache->second.todo_ == TODO_SET) { // 设置新的数据 attrs_.insert(std::make_pair(it_cache->first, it_cache->second)); } else if (it_cache->second.todo_ == TODO_DEL) { attrs_.erase(it_attr); } else { logger_warn("unknown todo(%d)", (int) it_cache->second.todo_); } } // 清除缓存的数据:因为内部的数据已经被添加至 attrs_ 中, // 所以只需要将 attrs_cache_ 空间清除即可 attrs_cache_.clear(); // 调用纯虚接口,向 memcached 或类似缓存中添加数据 if (set_attrs(attrs_) == false) { logger_error("set cache error, sid(%s)", sid_.c_str()); attrs_clear(attrs_); // 清除属性集合数据 return false; } attrs_clear(attrs_); // 清除属性集合数据 if (!sid_saved_) sid_saved_ = true; return true; }
static void set_acl(CXmlNodePtr base) { CXmlNodePtr acl, acl_to_set = NULL; acl = fileattr_find(base,"acl"); while(acl) { const char *user = fileattr_getvalue(acl,"@user"); const char *branch = fileattr_getvalue(acl,"@branch"); const char *merge = fileattr_getvalue(acl,"@merge"); if(((!user && !parms.user) || (user && parms.user && !usercmp(user,parms.user))) && ((!branch && !parms.branch) || (branch && parms.branch && !strcmp(branch,parms.branch))) && ((!merge && !parms.merge) || (merge && parms.merge && !strcmp(merge,parms.merge)))) { acl_to_set = acl; break; } acl = fileattr_next(acl); } if(acl_to_set) fileattr_batch_delete(acl_to_set); if(!parms.del) { char *parm = xstrdup(parms.access); char *acc = parm?strtok(parm,","):NULL; base->NewNode("acl"); fileattr_modified(); if(parms.user) base->NewAttribute("user",parms.user); if(parms.branch) base->NewAttribute("branch",parms.branch); if(parms.merge) base->NewAttribute("merge",parms.merge); if(parms.priority && atoi(parms.priority)) base->NewAttribute("priority",parms.priority); if(parms.message) base->NewNode("message",parms.message,false); base->NewNode("modified_by",getcaller(),false); base->NewNode("modified_date",current_date,false); while(acc) { int deny=0; if(!strncmp(acc,"no",2) && strcmp(acc,"none")) { deny=1; acc+=2; } if(!strcmp(acc,"all")) set_attrs(base,"all",deny,parms.noinherit); else if(!strcmp(acc,"none")) set_attrs(base,"all",!deny,parms.noinherit); else if(!strcmp(acc,"read")) set_attrs(base,"read",deny,parms.noinherit); else if(!strcmp(acc,"write")) set_attrs(base,"write",deny,parms.noinherit); else if(!strcmp(acc,"create")) set_attrs(base,"create",deny,parms.noinherit); else if(!strcmp(acc,"tag")) set_attrs(base,"tag",deny,parms.noinherit); else if(!strcmp(acc,"control")) set_attrs(base,"control",deny,parms.noinherit); else error(1,0,"Invalid access control attribute '%s'",acc); acc = strtok(NULL,","); } base->GetParent(); fileattr_prune(base); xfree(parm); } else { if(acl_to_set) fileattr_prune(acl_to_set); } }