SimpleProperties.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef SIMPLE_PROPERTIES_HPP
  14. #define SIMPLE_PROPERTIES_HPP
  15. #include <ndb_global.h>
  16. #include <NdbOut.hpp>
  17. /**
  18.  * @class SimpleProperties
  19.  * @brief Key-value-pair container.  Actully a list of named elements.
  20.  *
  21.  * SimpleProperties:
  22.  * - The keys are Uint16
  23.  * - The values are either Uint32 or null terminated c-strings
  24.  * 
  25.  * @note  Keys may be repeated.
  26.  * 
  27.  * Examples of things that can be stored in a SimpleProperties object:
  28.  * - Lists like: ((1, "foo"), (2, "bar"), (3, 32), (2, "baz"))
  29.  */
  30. class SimpleProperties {
  31. public:
  32.   /**
  33.    * Value types
  34.    */
  35.    enum ValueType {
  36.     Uint32Value  = 0,
  37.     StringValue  = 1,
  38.     BinaryValue  = 2,
  39.     InvalidValue = 3
  40.    };
  41.   /**
  42.    * Struct for defining mapping to be used with unpack
  43.    */
  44.   struct SP2StructMapping {
  45.     Uint16 Key;
  46.     Uint32 Offset;
  47.     ValueType Type;
  48.     Uint32 minValue;
  49.     Uint32 maxValue;
  50.     Uint32 Length_Offset; // Offset used for looking up length of 
  51.                           // data if Type = BinaryValue
  52.   };
  53.   /**
  54.    * UnpackStatus - Value returned from unpack
  55.    */
  56.   enum UnpackStatus {
  57.     Eof = 0,            // Success, end of SimpleProperties object reached
  58.     Break = 1,          // Success 
  59.     TypeMismatch = 2,
  60.     ValueTooLow = 3,
  61.     ValueTooHigh = 4,
  62.     UnknownKey = 5,
  63.     OutOfMemory = 6     // Only used when packing
  64.   };
  65.   /**
  66.    * Unpack
  67.    */
  68.   class Reader;
  69.   static UnpackStatus unpack(class Reader & it, 
  70.      void * dst, 
  71.      const SP2StructMapping[], Uint32 mapSz,
  72.      bool ignoreMinMax,
  73.      bool ignoreUnknownKeys);
  74.   
  75.   class Writer;
  76.   static UnpackStatus pack(class Writer &,
  77.    const void * src,
  78.    const SP2StructMapping[], Uint32 mapSz, 
  79.    bool ignoreMinMax);
  80.   
  81.   /**
  82.    * Reader class
  83.    */
  84.   class Reader {
  85.   public:
  86.     /**
  87.      * Move to first element
  88.      *   Return true if element exist
  89.      */
  90.     bool first();
  91.     
  92.     /**
  93.      * Move to next element
  94.      *   Return true if element exist
  95.      */
  96.     bool next();
  97.     
  98.     /**
  99.      * Is this valid
  100.      */
  101.     bool valid() const;
  102.     /**
  103.      * Get key
  104.      *  Note only valid is valid() == true
  105.      */
  106.     Uint16 getKey() const;
  107.     /**
  108.      * Get value length in bytes - (including terminating 0 for strings)
  109.      *  Note only valid is valid() == true
  110.      */
  111.     Uint16 getValueLen() const;
  112.     /**
  113.      * Get value type
  114.      *  Note only valid is valid() == true
  115.      */
  116.     ValueType getValueType() const;
  117.     
  118.     /**
  119.      * Get value
  120.      *  Note only valid is valid() == true
  121.      */
  122.     Uint32 getUint32() const;
  123.     char * getString(char * dst) const;
  124.     
  125.     /**
  126.      * Print the complete simple properties (for debugging)
  127.      */
  128.     void printAll(NdbOut& ndbout);
  129.   private:
  130.     bool readValue();
  131.     
  132.     Uint16 m_key;
  133.     Uint16 m_itemLen;
  134.     union {
  135.       Uint32 m_ui32_value;
  136.       Uint32 m_strLen; // Including 0-byte in words
  137.     };
  138.     ValueType m_type;
  139.   protected:
  140.     Reader();
  141.     virtual void reset() = 0;
  142.     
  143.     virtual bool step(Uint32 len) = 0;
  144.     virtual bool getWord(Uint32 * dst) = 0;
  145.     virtual bool peekWord(Uint32 * dst) const = 0;
  146.     virtual bool peekWords(Uint32 * dst, Uint32 len) const = 0;
  147.   };
  148.   /**
  149.    * Writer class
  150.    */
  151.   class Writer {
  152.   public:
  153.     bool first();
  154.     bool add(Uint16 key, Uint32 value);
  155.     bool add(Uint16 key, const char * value);
  156.     bool add(Uint16 key, const void* value, int len);
  157.   protected:
  158.     virtual bool reset() = 0;
  159.     virtual bool putWord(Uint32 val) = 0;
  160.     virtual bool putWords(const Uint32 * src, Uint32 len) = 0;
  161.   };
  162. };
  163. /**
  164.  * Reader for linear memory
  165.  */
  166. class SimplePropertiesLinearReader : public SimpleProperties::Reader {
  167. public:
  168.   SimplePropertiesLinearReader(const Uint32 * src, Uint32 len);
  169.   
  170.   virtual void reset();
  171.   virtual bool step(Uint32 len);
  172.   virtual bool getWord(Uint32 * dst);
  173.   virtual bool peekWord(Uint32 * dst) const ;
  174.   virtual bool peekWords(Uint32 * dst, Uint32 len) const;
  175. private:
  176.   Uint32 m_len;
  177.   Uint32 m_pos;
  178.   const Uint32 * m_src;
  179. };
  180. /**
  181.  * Writer for linear memory
  182.  */
  183. class LinearWriter : public SimpleProperties::Writer {
  184. public:
  185.   LinearWriter(Uint32 * src, Uint32 len);
  186.   
  187.   virtual bool reset();
  188.   virtual bool putWord(Uint32 val);
  189.   virtual bool putWords(const Uint32 * src, Uint32 len);
  190.   Uint32 getWordsUsed() const;
  191. private:
  192.   Uint32 m_len;
  193.   Uint32 m_pos;
  194.   Uint32 * m_src;
  195. };
  196. /**
  197.  * Writer for linear memory
  198.  */
  199. class UtilBufferWriter : public SimpleProperties::Writer {
  200. public:
  201.   UtilBufferWriter(class UtilBuffer & buf);
  202.   
  203.   virtual bool reset();
  204.   virtual bool putWord(Uint32 val);
  205.   virtual bool putWords(const Uint32 * src, Uint32 len);
  206.   Uint32 getWordsUsed() const;
  207. private:
  208.   class UtilBuffer & m_buf;
  209. };
  210. /**
  211.  * Reader for long signal section memory
  212.  *
  213.  *
  214.  * Implemented in kernel/vm/SimplePropertiesSection.cpp
  215.  */
  216. class SimplePropertiesSectionReader : public SimpleProperties::Reader {
  217. public:
  218.   SimplePropertiesSectionReader(struct SegmentedSectionPtr &,
  219. class SectionSegmentPool &);
  220.   
  221.   virtual void reset();
  222.   virtual bool step(Uint32 len);
  223.   virtual bool getWord(Uint32 * dst);
  224.   virtual bool peekWord(Uint32 * dst) const ;
  225.   virtual bool peekWords(Uint32 * dst, Uint32 len) const;
  226.   Uint32 getSize() const;
  227.   bool getWords(Uint32 * dst, Uint32 len);
  228. private:
  229.   Uint32 m_pos;
  230.   Uint32 m_len;
  231.   class SectionSegmentPool & m_pool;
  232.   struct SectionSegment * m_head;
  233.   struct SectionSegment * m_currentSegment;
  234. };
  235. inline
  236. Uint32 SimplePropertiesSectionReader::getSize() const
  237. {
  238.   return m_len;
  239. }
  240. /**
  241.  * Writer for long signal section memory
  242.  *
  243.  *
  244.  * Implemented in kernel/vm/SimplePropertiesSection.cpp
  245.  */
  246. class SimplePropertiesSectionWriter : public SimpleProperties::Writer {
  247. public:
  248.   SimplePropertiesSectionWriter(class SectionSegmentPool &);
  249.   virtual bool reset();
  250.   virtual bool putWord(Uint32 val);
  251.   virtual bool putWords(const Uint32 * src, Uint32 len);
  252.   /**
  253.    * This "unlinks" the writer from the memory
  254.    */
  255.   void getPtr(struct SegmentedSectionPtr & dst);
  256.   
  257. private:
  258.   Int32 m_pos;
  259.   Uint32 m_sz;
  260.   class SectionSegmentPool & m_pool;
  261.   struct SectionSegment * m_head;
  262.   Uint32 m_prevPtrI; // Prev to m_currentSegment
  263.   struct SectionSegment * m_currentSegment;
  264. };
  265. #endif