📄 attributeheader.hpp
字号:
/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifndef ATTRIBUTE_HEADER#define ATTRIBUTE_HEADER/** * @class AttributeHeader * @brief Header passed in front of every attribute value in AttrInfo signal */class AttributeHeader { friend class Dbtup; friend class Backup; friend class NdbOperation; friend class DbUtil; friend class Suma;public: /** * Psuedo columns */ STATIC_CONST( PSUEDO = 0x8000 ); STATIC_CONST( FRAGMENT = 0xFFFE ); // Read fragment no STATIC_CONST( ROW_COUNT = 0xFFFD ); // Read row count (committed) STATIC_CONST( COMMIT_COUNT = 0xFFFC ); // Read commit count STATIC_CONST( RANGE_NO = 0xFFFB ); // Read range no (when batched ranges) STATIC_CONST( ROW_SIZE = 0xFFFA ); STATIC_CONST( FRAGMENT_MEMORY= 0xFFF9 ); /** Initialize AttributeHeader at location aHeaderPtr */ static AttributeHeader& init(void* aHeaderPtr, Uint32 anAttributeId, Uint32 aDataSize); /** Returns size of AttributeHeader (usually one or two words) */ Uint32 getHeaderSize() const; // In 32-bit words /** Store AttributeHeader in location given as argument */ void insertHeader(Uint32*); /** Get next attribute header (if there is one) */ AttributeHeader* getNext() const; /** Get location of attribute value */ Uint32* getDataPtr() const; /** Getters and Setters */ Uint32 getAttributeId() const; void setAttributeId(Uint32); Uint32 getDataSize() const; // In 32-bit words void setDataSize(Uint32); bool isNULL() const; void setNULL(); /** Print **/ //void print(NdbOut&); void print(FILE*); static Uint32 getDataSize(Uint32); public: AttributeHeader(Uint32 = 0); AttributeHeader(Uint32 anAttributeId, Uint32 aDataSize); ~AttributeHeader(); Uint32 m_value;};/** * 1111111111222222222233 * 01234567890123456789012345678901 * ssssssssssssss eiiiiiiiiiiiiiiii * * i = Attribute Id * s = Size of current "chunk" - 14 Bits -> 16384 (words) = 65k * Including optional extra word(s). * e - Element data/Blob, read element of array * If == 0 next data word contains attribute value. * If == 1 next data word contains: * For Array of Fixed size Elements * Start Index (16 bit), Stop Index(16 bit) * For Blob * Start offset (32 bit) (length is defined in previous word) * * An attribute value equal to "null" is represented by setting s == 0. * * Bit 14 is not yet used. */inlineAttributeHeader& AttributeHeader::init(void* aHeaderPtr, Uint32 anAttributeId, Uint32 aDataSize){ return * new (aHeaderPtr) AttributeHeader(anAttributeId, aDataSize);}inlineAttributeHeader::AttributeHeader(Uint32 aHeader){ m_value = aHeader;}inlineAttributeHeader::AttributeHeader(Uint32 anAttributeId, Uint32 aDataSize){ m_value = 0; this->setAttributeId(anAttributeId); this->setDataSize(aDataSize);}inlineAttributeHeader::~AttributeHeader(){}inlineUint32 AttributeHeader::getHeaderSize() const{ // Should check 'e' bit here return 1;}inlineUint32 AttributeHeader::getAttributeId() const{ return (m_value & 0xFFFF0000) >> 16;}inlinevoid AttributeHeader::setAttributeId(Uint32 anAttributeId){ m_value &= 0x0000FFFF; // Clear attribute id m_value |= (anAttributeId << 16);}inlineUint32 AttributeHeader::getDataSize() const{ return (m_value & 0x3FFF);}inlinevoid AttributeHeader::setDataSize(Uint32 aDataSize){ m_value &= (~0x3FFF); m_value |= aDataSize;}inlinebool AttributeHeader::isNULL() const{ return (getDataSize() == 0);}inlinevoid AttributeHeader::setNULL(){ setDataSize(0);}inlineUint32* AttributeHeader::getDataPtr() const{ return (Uint32*)&m_value + getHeaderSize();}inlinevoid AttributeHeader::insertHeader(Uint32* target){ *target = m_value;}inlineAttributeHeader* AttributeHeader::getNext() const { return (AttributeHeader*)(getDataPtr() + getDataSize());}inlinevoid//AttributeHeader::print(NdbOut& output) {AttributeHeader::print(FILE* output) { fprintf(output, "AttributeId: H\'%.8x (D\'%d), DataSize: H\'%.8x (D\'%d), " "isNULL: %d\n", getAttributeId(), getAttributeId(), getDataSize(), getDataSize(), isNULL());}inlineUint32AttributeHeader::getDataSize(Uint32 m_value){ return (m_value & 0x3FFF); }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -