MongoDB源码分析--Command体系架构

  发布时间:2025-11-05 08:42:38   作者:玩站小弟   我要评论
复制//commands.h classCommand{ public: //执行当前Command时所使用的锁类型 。
MongoDB源码分析--Command体系架构
复制//commands.h class Command {   public:   //执行当前Command时所使用的码分锁类型 enum LockType { READ = -1/*读*/ , NONE = 0 /*无锁*/, WRITE = 1 /*写*/};   const string name;   /* 运行指定的命令,需要子类实现      fromRepl - command is being invoked as part of replication syncing.  In this situation you      normally do not want to log the command to the local oplog.      如执行成功返回true,体系否则为false, errmsg记录错误信息      */ virtualbool run(const string& db, BSONObj& cmdObj, string& errmsg, BSONObjBuilder& result, bool fromRepl) = 0;   /*      note: logTheTop() MUST be false if READ      if NONE, cant use Client::Context setup      use with caution      */ virtual LockType locktype() const = 0;   /* 是否有管理特权才可运行该命令 has privileges to run this command. */ virtualbool adminOnly() const {   returnfalse;      }   //html格式的帮助信息 void htmlHelp(stringstream&) const;   /* 与adminOnly相似,但更严格: 要么被验证,要么只运行在本地接口(local interface)      注:当本属性为true时,架构adminOnly()也必须为true.      */ virtualbool localHostOnlyIfNoAuth(const BSONObj& cmdObj) { returnfalse; }   /* 如果replication pair 的码分slaves可以运行命令的IT技术网,则返回true      (the command directly from a client -- if fromRepl,体系 always allowed).      */ virtualbool slaveOk() const = 0;   /* 通过在查询命令中打开 slaveok选项,客户端强制在一个slave上运行一个命令时,架构返回true.      */ virtualbool slaveOverrideOk() {   returnfalse;      }   /* Override and return true to if true,码分log the operation (logOp()) to the replication log.      (not done if fromRepl of course)      Note if run() returns false, we do NOT log.      */ virtualbool logTheOp() { returnfalse; }   virtualvoid help( stringstream& help ) const;   /* Return true if authentication and security applies to the commands.  Some commands      (e.g., getnonce, authenticate) can be done by anyone even unauthorized.      */ virtualbool requiresAuth() { returntrue; }   /** @param webUI:在web上暴露当前command,形如 localhost:28017/<name>      @param oldName: 旧选项,体系表示当前command的架构旧(已弃用)名称      */    Command(constchar *_name, bool webUI = false, constchar *oldName = 0);   virtual ~Command() {}   protected:      BSONObj getQuery( const BSONObj& cmdObj ) {   if ( cmdObj["query"].type() == Object )   return cmdObj["query"].embeddedObject();   if ( cmdObj["q"].type() == Object )   return cmdObj["q"].embeddedObject();   return BSONObj();      }   staticvoid logIfSlow( const Timer& cmdTimer,  const string& msg);   //command map,其包含系统实现的所有command对象,亿华云计算以便findCommand查询时使用 //注意也包含该command的码分旧名称(构造方法中的oldName参数)所对应的对象, static map<string,体系Command*> * _commands;   //与上面形同,但不含旧名称的架构command map static map<string,Command*> * _commandsByBestName;   //将web类型的command放到该map中 static map<string,Command*> * _webCommands;   public:   staticconst map<string,Command*>* commandsByBestName() { return _commandsByBestName; }   staticconst map<string,Command*>* webCommands() { return _webCommands; }   /** @return 返回是服务器托管否找到或已执行command */ staticbool runAgainstRegistered(constchar *ns, BSONObj& jsobj, BSONObjBuilder& anObjBuilder);   static LockType locktype( const string& name );   //根据命令名称在集合中找到相应Command对象 static Command * findCommand( const string& name );   };  1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.
  • Tag:

相关文章

  • 网吧电脑脱离主机教程(轻松拆解,自由组装,享受自由游戏体验)

    摘要:随着科技的不断发展,越来越多的人选择在网吧享受游戏的乐趣。然而,在繁忙的人群中找到一个空余的电脑并不容易。为了解决这个问题,我们可以学习一些技巧,将网吧电脑脱离主机,实现随时随地的...
    2025-11-05
  • 一枚元老级通用顶级域名的逆袭

    在互联网的世界里,一个域名往往决定着用户对平台的第一印象。当人们看到以“.info”结尾的网址时,会自然而然地将其与“信息”“知识”“资源”等关键词关联——这种直觉认知正是.info域名的独特价值。作
    2025-11-05
  • 域名批量查询工具哪个好用?

    近日有米友咨询,有没有免费的批量域名查询工具,因为自己经常一次性需要查询多个域名,每次单个查询比较浪费时间。下面聚名网小编就给大家介绍下域名批量查询工具哪个好用?1、域名批量查询聚查工具这里小聚给大家
    2025-11-05
  • world域名代表什么意思?world域名价值如何?

    在互联网快速发展的今天,选择一个合适的顶级域名已成为企业和个人打造品牌的关键一步。其中,.world域名逐渐走入大众视野,受到全球用户的青睐。那到底,world域名代表什么意思?world域名价值如何
    2025-11-05
  • 手机连接电脑时发生未知错误的解决方法(解决手机连接电脑出现问题的简易步骤)

    摘要:在现代社会中,手机已经成为人们生活中不可或缺的工具之一。而与此同时,将手机与电脑连接也成为了人们常见的需求之一。然而,有时我们可能会遇到一些意外情况,例如手机连接电脑时出现未知错误...
    2025-11-05
  • 如何把MongoDB作为循环队列

    我们在使用MongoDB的时候,一个集合里面能放多少数据,一般取决于硬盘大小,只要硬盘足够大,那么我们可以无休止地往里面添加数据。然后,有些时候,我只想把MongoDB作为一个循环队列来使用,期望它有
    2025-11-05

最新评论