⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbtux.hpp

📁 mysql-5.0.22.tar.gz源码包
💻 HPP
📖 第 1 页 / 共 3 页
字号:
  // indexes and fragments  /*   * Ordered index.  Top level data structure.  The primary table (table   * being indexed) lives in TUP.   */  struct Index;  friend struct Index;  struct Index {    enum State {      NotDefined = 0,      Defining = 1,      Online = 2,               // triggers activated and build done      Dropping = 9    };    State m_state;    DictTabInfo::TableType m_tableType;    Uint32 m_tableId;    Uint16 unused;    Uint16 m_numFrags;    Uint32 m_fragId[MaxIndexFragments];    Uint32 m_fragPtrI[MaxIndexFragments];    Uint32 m_descPage;          // descriptor page    Uint16 m_descOff;           // offset within the page    Uint16 m_numAttrs;    bool m_storeNullKey;    union {    Uint32 nextPool;    };    Index();  };  typedef Ptr<Index> IndexPtr;  ArrayPool<Index> c_indexPool;  /*   * Fragment of an index, as known to DIH/TC.  Represents the two   * duplicate fragments known to LQH/ACC/TUP.  Includes tree header.   * There are no maintenance operation records yet.   */  struct Frag;  friend struct Frag;  struct Frag {    Uint32 m_tableId;           // copy from index level    Uint32 m_indexId;    Uint16 unused;    Uint16 m_fragId;    Uint32 m_descPage;          // copy from index level    Uint16 m_descOff;    Uint16 m_numAttrs;    bool m_storeNullKey;    TreeHead m_tree;    TupLoc m_freeLoc;           // list of free index nodes    DLList<ScanOp> m_scanList;  // current scans on this fragment    Uint32 m_tupIndexFragPtrI;    Uint32 m_tupTableFragPtrI[2];    Uint32 m_accTableFragPtrI[2];    union {    Uint32 nextPool;    };    Frag(ArrayPool<ScanOp>& scanOpPool);  };  typedef Ptr<Frag> FragPtr;  ArrayPool<Frag> c_fragPool;  /*   * Fragment metadata operation.   */  struct FragOp {    Uint32 m_userPtr;    Uint32 m_userRef;    Uint32 m_indexId;    Uint32 m_fragId;    Uint32 m_fragPtrI;    Uint32 m_fragNo;            // fragment number starting at zero    Uint32 m_numAttrsRecvd;    union {    Uint32 nextPool;    };    FragOp();  };  typedef Ptr<FragOp> FragOpPtr;  ArrayPool<FragOp> c_fragOpPool;  // node handles  /*   * A node handle is a reference to a tree node in TUP.  It is used to   * operate on the node.  Node handles are allocated on the stack.   */  struct NodeHandle;  friend struct NodeHandle;  struct NodeHandle {    Frag& m_frag;               // fragment using the node    TupLoc m_loc;               // physical node address    TreeNode* m_node;           // pointer to node storage    NodeHandle(Frag& frag);    NodeHandle(const NodeHandle& node);    NodeHandle& operator=(const NodeHandle& node);    // check if unassigned    bool isNull();    // getters    TupLoc getLink(unsigned i);    unsigned getChilds();       // cannot spell    unsigned getSide();    unsigned getOccup();    int getBalance();    Uint32 getNodeScan();    // setters    void setLink(unsigned i, TupLoc loc);    void setSide(unsigned i);    void setOccup(unsigned n);    void setBalance(int b);    void setNodeScan(Uint32 scanPtrI);    // access other parts of the node    Data getPref();    TreeEnt getEnt(unsigned pos);    TreeEnt getMinMax(unsigned i);    // for ndbrequire and ndbassert    void progError(int line, int cause, const char* file);  };  // methods  /*   * DbtuxGen.cpp   */  void execCONTINUEB(Signal* signal);  void execSTTOR(Signal* signal);  void execREAD_CONFIG_REQ(Signal* signal);  // utils  void setKeyAttrs(const Frag& frag);  void readKeyAttrs(const Frag& frag, TreeEnt ent, unsigned start, Data keyData);  void readTablePk(const Frag& frag, TreeEnt ent, Data pkData, unsigned& pkSize);  void copyAttrs(const Frag& frag, ConstData data1, Data data2, unsigned maxlen2 = MaxAttrDataSize);  /*   * DbtuxMeta.cpp   */  void execTUXFRAGREQ(Signal* signal);  void execTUX_ADD_ATTRREQ(Signal* signal);  void execALTER_INDX_REQ(Signal* signal);  void execDROP_TAB_REQ(Signal* signal);  bool allocDescEnt(IndexPtr indexPtr);  void freeDescEnt(IndexPtr indexPtr);  void abortAddFragOp(Signal* signal);  void dropIndex(Signal* signal, IndexPtr indexPtr, Uint32 senderRef, Uint32 senderData);  /*   * DbtuxMaint.cpp   */  void execTUX_MAINT_REQ(Signal* signal);    /*   * DbtuxNode.cpp   */  int allocNode(Signal* signal, NodeHandle& node);  void selectNode(NodeHandle& node, TupLoc loc);  void insertNode(NodeHandle& node);  void deleteNode(NodeHandle& node);  void setNodePref(NodeHandle& node);  // node operations  void nodePushUp(NodeHandle& node, unsigned pos, const TreeEnt& ent, Uint32 scanList);  void nodePushUpScans(NodeHandle& node, unsigned pos);  void nodePopDown(NodeHandle& node, unsigned pos, TreeEnt& en, Uint32* scanList);  void nodePopDownScans(NodeHandle& node, unsigned pos);  void nodePushDown(NodeHandle& node, unsigned pos, TreeEnt& ent, Uint32& scanList);  void nodePushDownScans(NodeHandle& node, unsigned pos);  void nodePopUp(NodeHandle& node, unsigned pos, TreeEnt& ent, Uint32 scanList);  void nodePopUpScans(NodeHandle& node, unsigned pos);  void nodeSlide(NodeHandle& dstNode, NodeHandle& srcNode, unsigned cnt, unsigned i);  // scans linked to node  void addScanList(NodeHandle& node, unsigned pos, Uint32 scanList);  void removeScanList(NodeHandle& node, unsigned pos, Uint32& scanList);  void moveScanList(NodeHandle& node, unsigned pos);  void linkScan(NodeHandle& node, ScanOpPtr scanPtr);  void unlinkScan(NodeHandle& node, ScanOpPtr scanPtr);  bool islinkScan(NodeHandle& node, ScanOpPtr scanPtr);  /*   * DbtuxTree.cpp   */  // add entry  void treeAdd(Frag& frag, TreePos treePos, TreeEnt ent);  void treeAddFull(Frag& frag, NodeHandle lubNode, unsigned pos, TreeEnt ent);  void treeAddNode(Frag& frag, NodeHandle lubNode, unsigned pos, TreeEnt ent, NodeHandle parentNode, unsigned i);  void treeAddRebalance(Frag& frag, NodeHandle node, unsigned i);  // remove entry  void treeRemove(Frag& frag, TreePos treePos);  void treeRemoveInner(Frag& frag, NodeHandle lubNode, unsigned pos);  void treeRemoveSemi(Frag& frag, NodeHandle node, unsigned i);  void treeRemoveLeaf(Frag& frag, NodeHandle node);  void treeRemoveNode(Frag& frag, NodeHandle node);  void treeRemoveRebalance(Frag& frag, NodeHandle node, unsigned i);  // rotate  void treeRotateSingle(Frag& frag, NodeHandle& node, unsigned i);  void treeRotateDouble(Frag& frag, NodeHandle& node, unsigned i);  /*   * DbtuxScan.cpp   */  void execACC_SCANREQ(Signal* signal);  void execTUX_BOUND_INFO(Signal* signal);  void execNEXT_SCANREQ(Signal* signal);  void execACC_CHECK_SCAN(Signal* signal);  void execACCKEYCONF(Signal* signal);  void execACCKEYREF(Signal* signal);  void execACC_ABORTCONF(Signal* signal);  void scanFirst(ScanOpPtr scanPtr);  void scanNext(ScanOpPtr scanPtr, bool fromMaintReq);  bool scanVisible(ScanOpPtr scanPtr, TreeEnt ent);  void scanClose(Signal* signal, ScanOpPtr scanPtr);  void addAccLockOp(ScanOp& scan, Uint32 accLockOp);  void removeAccLockOp(ScanOp& scan, Uint32 accLockOp);  void releaseScanOp(ScanOpPtr& scanPtr);  /*   * DbtuxSearch.cpp   */  void searchToAdd(Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos);  void searchToRemove(Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos);  void searchToScan(Frag& frag, ConstData boundInfo, unsigned boundCount, bool descending, TreePos& treePos);  void searchToScanAscending(Frag& frag, ConstData boundInfo, unsigned boundCount, TreePos& treePos);  void searchToScanDescending(Frag& frag, ConstData boundInfo, unsigned boundCount, TreePos& treePos);  /*   * DbtuxCmp.cpp   */  int cmpSearchKey(const Frag& frag, unsigned& start, ConstData searchKey, ConstData entryData, unsigned maxlen = MaxAttrDataSize);  int cmpScanBound(const Frag& frag, unsigned dir, ConstData boundInfo, unsigned boundCount, ConstData entryData, unsigned maxlen = MaxAttrDataSize);  /*   * DbtuxDebug.cpp   */  void execDUMP_STATE_ORD(Signal* signal);#ifdef VM_TRACE  struct PrintPar {    char m_path[100];           // LR prefix    unsigned m_side;            // expected side    TupLoc m_parent;            // expected parent address    int m_depth;                // returned depth    unsigned m_occup;           // returned occupancy    TreeEnt m_minmax[2];        // returned subtree min and max    bool m_ok;                  // returned status    PrintPar();  };  void printTree(Signal* signal, Frag& frag, NdbOut& out);  void printNode(Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par);  friend class NdbOut& operator<<(NdbOut&, const TupLoc&);  friend class NdbOut& operator<<(NdbOut&, const TreeEnt&);  friend class NdbOut& operator<<(NdbOut&, const TreeNode&);  friend class NdbOut& operator<<(NdbOut&, const TreeHead&);  friend class NdbOut& operator<<(NdbOut&, const TreePos&);  friend class NdbOut& operator<<(NdbOut&, const DescAttr&);  friend class NdbOut& operator<<(NdbOut&, const ScanOp&);  friend class NdbOut& operator<<(NdbOut&, const Index&);  friend class NdbOut& operator<<(NdbOut&, const Frag&);  friend class NdbOut& operator<<(NdbOut&, const FragOp&);  friend class NdbOut& operator<<(NdbOut&, const NodeHandle&);  FILE* debugFile;  NdbOut debugOut;  unsigned debugFlags;  enum {    DebugMeta = 1,              // log create and drop index    DebugMaint = 2,             // log maintenance ops    DebugTree = 4,              // log and check tree after each op    DebugScan = 8               // log scans  };  STATIC_CONST( DataFillByte = 0xa2 );  STATIC_CONST( NodeFillByte = 0xa4 );#endif  // start up info  Uint32 c_internalStartPhase;  Uint32 c_typeOfStart;  /*   * Global data set at operation start.  Unpacked from index metadata.   * Not passed as parameter to methods.  Invalid across timeslices.   *   * TODO inline all into index metadata   */  // index key attr ids with sizes in AttributeHeader format  Data c_keyAttrs;  // pointers to index key comparison functions  NdbSqlUtil::Cmp** c_sqlCmp;  /*   * Other buffers used during the operation.   */  // buffer for search key data with headers  Data c_searchKey;  // buffer for current entry key data with headers  Data c_entryKey;  // buffer for scan bounds and keyinfo (primary key)  Data c_dataBuffer;  // inlined utils  DescEnt& getDescEnt(Uint32 descPage, Uint32 descOff);  Uint32 getTupAddr(const Frag& frag, TreeEnt ent);  static unsigned min(unsigned x, unsigned y);  static unsigned max(unsigned x, unsigned y);};// Dbtux::DatainlineDbtux::Data::Data() :  m_data(0){}inlineDbtux::Data::Data(Uint32* data) :  m_data(data){}inline Dbtux::Data&Dbtux::Data::operator=(Uint32* data){  m_data = data;  return *this;}inlineDbtux::Data::operator Uint32*() const{  return m_data;}inline Dbtux::Data&Dbtux::Data::operator+=(size_t n){  m_data += n;  return *this;}inline AttributeHeader&Dbtux::Data::ah() const{  return *reinterpret_cast<AttributeHeader*>(m_data);}// Dbtux::ConstDatainlineDbtux::ConstData::ConstData() :  m_data(0){}inlineDbtux::ConstData::ConstData(const Uint32* data) :  m_data(data){}inline Dbtux::ConstData&Dbtux::ConstData::operator=(const Uint32* data){  m_data = data;  return *this;}inlineDbtux::ConstData::operator const Uint32*() const{  return m_data;}inline Dbtux::ConstData&Dbtux::ConstData::operator+=(size_t n){  m_data += n;  return *this;}inline const AttributeHeader&Dbtux::ConstData::ah() const{  return *reinterpret_cast<const AttributeHeader*>(m_data);}inlineDbtux::ConstData::ConstData(Data data) :  m_data(static_cast<Uint32*>(data)){}inline Dbtux::ConstData&Dbtux::ConstData::operator=(Data data){  m_data = static_cast<Uint32*>(data);  return *this;}// Dbtux::TupLocinlineDbtux::TupLoc::TupLoc() :  m_pageId1(RNIL >> 16),  m_pageId2(RNIL & 0xFFFF),  m_pageOffset(0){}inlineDbtux::TupLoc::TupLoc(Uint32 pageId, Uint16 pageOffset) :  m_pageId1(pageId >> 16),  m_pageId2(pageId & 0xFFFF),  m_pageOffset(pageOffset){}inline Uint32Dbtux::TupLoc::getPageId() const{  return (m_pageId1 << 16) | m_pageId2;}inline voidDbtux::TupLoc::setPageId(Uint32 pageId){  m_pageId1 = (pageId >> 16);  m_pageId2 = (pageId & 0xFFFF);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -