diff options
Diffstat (limited to 'storage/ndb/include/util/SimpleProperties.hpp')
-rw-r--r-- | storage/ndb/include/util/SimpleProperties.hpp | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/storage/ndb/include/util/SimpleProperties.hpp b/storage/ndb/include/util/SimpleProperties.hpp new file mode 100644 index 00000000000..356f3406f38 --- /dev/null +++ b/storage/ndb/include/util/SimpleProperties.hpp @@ -0,0 +1,289 @@ +/* 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 SIMPLE_PROPERTIES_HPP +#define SIMPLE_PROPERTIES_HPP + +#include <ndb_global.h> +#include <NdbOut.hpp> + +/** + * @class SimpleProperties + * @brief Key-value-pair container. Actully a list of named elements. + * + * SimpleProperties: + * - The keys are Uint16 + * - The values are either Uint32 or null terminated c-strings + * + * @note Keys may be repeated. + * + * Examples of things that can be stored in a SimpleProperties object: + * - Lists like: ((1, "foo"), (2, "bar"), (3, 32), (2, "baz")) + */ +class SimpleProperties { +public: + /** + * Value types + */ + enum ValueType { + Uint32Value = 0, + StringValue = 1, + BinaryValue = 2, + InvalidValue = 3 + }; + + /** + * Struct for defining mapping to be used with unpack + */ + struct SP2StructMapping { + Uint16 Key; + Uint32 Offset; + ValueType Type; + Uint32 minValue; + Uint32 maxValue; + Uint32 Length_Offset; // Offset used for looking up length of + // data if Type = BinaryValue + }; + + /** + * UnpackStatus - Value returned from unpack + */ + enum UnpackStatus { + Eof = 0, // Success, end of SimpleProperties object reached + Break = 1, // Success + TypeMismatch = 2, + ValueTooLow = 3, + ValueTooHigh = 4, + UnknownKey = 5, + OutOfMemory = 6 // Only used when packing + }; + + /** + * Unpack + */ + class Reader; + static UnpackStatus unpack(class Reader & it, + void * dst, + const SP2StructMapping[], Uint32 mapSz, + bool ignoreMinMax, + bool ignoreUnknownKeys); + + class Writer; + static UnpackStatus pack(class Writer &, + const void * src, + const SP2StructMapping[], Uint32 mapSz, + bool ignoreMinMax); + + /** + * Reader class + */ + class Reader { + public: + /** + * Move to first element + * Return true if element exist + */ + bool first(); + + /** + * Move to next element + * Return true if element exist + */ + bool next(); + + /** + * Is this valid + */ + bool valid() const; + + /** + * Get key + * Note only valid is valid() == true + */ + Uint16 getKey() const; + + /** + * Get value length in bytes - (including terminating 0 for strings) + * Note only valid is valid() == true + */ + Uint16 getValueLen() const; + + /** + * Get value type + * Note only valid is valid() == true + */ + ValueType getValueType() const; + + /** + * Get value + * Note only valid is valid() == true + */ + Uint32 getUint32() const; + char * getString(char * dst) const; + + /** + * Print the complete simple properties (for debugging) + */ + void printAll(NdbOut& ndbout); + + private: + bool readValue(); + + Uint16 m_key; + Uint16 m_itemLen; + union { + Uint32 m_ui32_value; + Uint32 m_strLen; // Including 0-byte in words + }; + ValueType m_type; + protected: + Reader(); + virtual void reset() = 0; + + virtual bool step(Uint32 len) = 0; + virtual bool getWord(Uint32 * dst) = 0; + virtual bool peekWord(Uint32 * dst) const = 0; + virtual bool peekWords(Uint32 * dst, Uint32 len) const = 0; + }; + + /** + * Writer class + */ + class Writer { + public: + bool first(); + bool add(Uint16 key, Uint32 value); + bool add(Uint16 key, const char * value); + bool add(Uint16 key, const void* value, int len); + protected: + virtual bool reset() = 0; + virtual bool putWord(Uint32 val) = 0; + virtual bool putWords(const Uint32 * src, Uint32 len) = 0; + }; +}; + +/** + * Reader for linear memory + */ +class SimplePropertiesLinearReader : public SimpleProperties::Reader { +public: + SimplePropertiesLinearReader(const Uint32 * src, Uint32 len); + + virtual void reset(); + virtual bool step(Uint32 len); + virtual bool getWord(Uint32 * dst); + virtual bool peekWord(Uint32 * dst) const ; + virtual bool peekWords(Uint32 * dst, Uint32 len) const; +private: + Uint32 m_len; + Uint32 m_pos; + const Uint32 * m_src; +}; + +/** + * Writer for linear memory + */ +class LinearWriter : public SimpleProperties::Writer { +public: + LinearWriter(Uint32 * src, Uint32 len); + + virtual bool reset(); + virtual bool putWord(Uint32 val); + virtual bool putWords(const Uint32 * src, Uint32 len); + Uint32 getWordsUsed() const; +private: + Uint32 m_len; + Uint32 m_pos; + Uint32 * m_src; +}; + +/** + * Writer for linear memory + */ +class UtilBufferWriter : public SimpleProperties::Writer { +public: + UtilBufferWriter(class UtilBuffer & buf); + + virtual bool reset(); + virtual bool putWord(Uint32 val); + virtual bool putWords(const Uint32 * src, Uint32 len); + Uint32 getWordsUsed() const; +private: + class UtilBuffer & m_buf; +}; + +/** + * Reader for long signal section memory + * + * + * Implemented in kernel/vm/SimplePropertiesSection.cpp + */ +class SimplePropertiesSectionReader : public SimpleProperties::Reader { +public: + SimplePropertiesSectionReader(struct SegmentedSectionPtr &, + class SectionSegmentPool &); + + virtual void reset(); + virtual bool step(Uint32 len); + virtual bool getWord(Uint32 * dst); + virtual bool peekWord(Uint32 * dst) const ; + virtual bool peekWords(Uint32 * dst, Uint32 len) const; + Uint32 getSize() const; + bool getWords(Uint32 * dst, Uint32 len); + +private: + Uint32 m_pos; + Uint32 m_len; + class SectionSegmentPool & m_pool; + struct SectionSegment * m_head; + struct SectionSegment * m_currentSegment; +}; + +inline +Uint32 SimplePropertiesSectionReader::getSize() const +{ + return m_len; +} + +/** + * Writer for long signal section memory + * + * + * Implemented in kernel/vm/SimplePropertiesSection.cpp + */ +class SimplePropertiesSectionWriter : public SimpleProperties::Writer { +public: + SimplePropertiesSectionWriter(class SectionSegmentPool &); + + virtual bool reset(); + virtual bool putWord(Uint32 val); + virtual bool putWords(const Uint32 * src, Uint32 len); + + /** + * This "unlinks" the writer from the memory + */ + void getPtr(struct SegmentedSectionPtr & dst); + +private: + Int32 m_pos; + Uint32 m_sz; + class SectionSegmentPool & m_pool; + struct SectionSegment * m_head; + Uint32 m_prevPtrI; // Prev to m_currentSegment + struct SectionSegment * m_currentSegment; +}; + +#endif |