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

MySQL数据库

开发平台:

Visual C++

  1. #ifndef __CONFIG_VALUES_HPP
  2. #define __CONFIG_VALUES_HPP
  3. #include <ndb_types.h>
  4. #include <UtilBuffer.hpp>
  5. class ConfigValues {
  6.   friend class ConfigValuesFactory;
  7.   ConfigValues(Uint32 sz, Uint32 data);
  8. public:
  9.   ~ConfigValues();
  10.   
  11.   enum ValueType {
  12.     InvalidType = 0,
  13.     IntType     = 1,
  14.     StringType  = 2,
  15.     SectionType = 3,
  16.     Int64Type   = 4
  17.   };
  18.   struct Entry {
  19.     Uint32 m_key;
  20.     ValueType m_type;
  21.     union {
  22.       Uint32 m_int;
  23.       Uint64 m_int64;
  24.       const char * m_string;
  25.     };
  26.   };
  27.   
  28.   class ConstIterator {
  29.     friend class ConfigValuesFactory;
  30.     const ConfigValues & m_cfg;
  31.   public:
  32.     Uint32 m_currentSection;
  33.     ConstIterator(const ConfigValues&c) : m_cfg(c) { m_currentSection = 0;}
  34.     
  35.     bool openSection(Uint32 key, Uint32 no);
  36.     bool closeSection();
  37.     bool get(Uint32 key, Entry *) const;
  38.     
  39.     bool get(Uint32 key, Uint32 * value) const;
  40.     bool get(Uint32 key, Uint64 * value) const;
  41.     bool get(Uint32 key, const char ** value) const;
  42.     bool getTypeOf(Uint32 key, ValueType * type) const;
  43.     
  44.     Uint32 get(Uint32 key, Uint32 notFound) const;
  45.     Uint64 get64(Uint32 key, Uint64 notFound) const;
  46.     const char * get(Uint32 key, const char * notFound) const;
  47.     ValueType getTypeOf(Uint32 key) const;
  48.   };
  49.   class Iterator : public ConstIterator {
  50.     ConfigValues & m_cfg;
  51.   public:
  52.     Iterator(ConfigValues&c) : ConstIterator(c), m_cfg(c) {}
  53.     Iterator(ConfigValues&c, const ConstIterator& i):ConstIterator(c),m_cfg(c){
  54.       m_currentSection = i.m_currentSection;
  55.     }
  56.     
  57.     bool set(Uint32 key, Uint32 value);
  58.     bool set(Uint32 key, Uint64 value);
  59.     bool set(Uint32 key, const char * value);
  60.   };
  61.   Uint32 getPackedSize() const; // get size in bytes needed to pack
  62.   Uint32 pack(UtilBuffer&) const;
  63.   Uint32 pack(void * dst, Uint32 len) const;// pack into dst(of len %d);
  64.   
  65. private:
  66.   friend class Iterator;
  67.   friend class ConstIterator;
  68.   bool getByPos(Uint32 pos, Entry *) const;
  69.   Uint64 * get64(Uint32 index) const;
  70.   char ** getString(Uint32 index) const;
  71.   Uint32 m_size;
  72.   Uint32 m_dataSize;
  73.   Uint32 m_stringCount;
  74.   Uint32 m_int64Count;
  75.   Uint32 m_values[1];
  76.   void * m_data[1];
  77. };
  78. class ConfigValuesFactory {
  79.   Uint32 m_currentSection;
  80. public:
  81.   Uint32 m_sectionCounter;
  82.   Uint32 m_freeKeys;
  83.   Uint32 m_freeData;
  84. public:
  85.   ConfigValuesFactory(Uint32 keys = 50, Uint32 data = 10); // Initial
  86.   ConfigValuesFactory(ConfigValues * m_cfg);        //
  87.   ConfigValues * m_cfg;
  88.   ConfigValues * getConfigValues();
  89.   bool openSection(Uint32 key, Uint32 no);
  90.   bool put(const ConfigValues::Entry & );
  91.   bool put(Uint32 key, Uint32 value);
  92.   bool put64(Uint32 key, Uint64 value);
  93.   bool put(Uint32 key, const char * value);
  94.   bool closeSection();
  95.   
  96.   void expand(Uint32 freeKeys, Uint32 freeData);
  97.   void shrink();
  98.   bool unpack(const UtilBuffer&);
  99.   bool unpack(const void * src, Uint32 len);
  100.   static ConfigValues * extractCurrentSection(const ConfigValues::ConstIterator &);
  101. private:
  102.   static ConfigValues * create(Uint32 keys, Uint32 data);
  103.   void put(const ConfigValues & src);
  104. };
  105. inline
  106. bool
  107. ConfigValues::ConstIterator::get(Uint32 key, Uint32 * value) const {
  108.   Entry tmp;
  109.   if(get(key, &tmp) && tmp.m_type == IntType){
  110.     * value = tmp.m_int;
  111.     return true;
  112.   }
  113.   return false;
  114. }
  115. inline
  116. bool
  117. ConfigValues::ConstIterator::get(Uint32 key, Uint64 * value) const {
  118.   Entry tmp;
  119.   if(get(key, &tmp) && tmp.m_type == Int64Type){
  120.     * value = tmp.m_int64;
  121.     return true;
  122.   }
  123.   return false;
  124. }
  125. inline
  126. bool
  127. ConfigValues::ConstIterator::get(Uint32 key, const char ** value) const {
  128.   Entry tmp;
  129.   if(get(key, &tmp) && tmp.m_type == StringType){
  130.     * value = tmp.m_string;
  131.     return true;
  132.   }
  133.   return false;
  134. }
  135. inline
  136. bool 
  137. ConfigValues::ConstIterator::getTypeOf(Uint32 key, ValueType * type) const{
  138.   Entry tmp;
  139.   if(get(key, &tmp)){
  140.     * type = tmp.m_type;
  141.     return true;
  142.   }
  143.   return false;
  144. }
  145. inline
  146. Uint32
  147. ConfigValues::ConstIterator::get(Uint32 key, Uint32 notFound) const {
  148.   Entry tmp;
  149.   if(get(key, &tmp) && tmp.m_type == IntType){
  150.     return tmp.m_int;
  151.   }
  152.   return notFound;
  153. }
  154. inline
  155. Uint64
  156. ConfigValues::ConstIterator::get64(Uint32 key, Uint64 notFound) const {
  157.   Entry tmp;
  158.   if(get(key, &tmp) && tmp.m_type == Int64Type){
  159.     return tmp.m_int64;
  160.   }
  161.   return notFound;
  162. }
  163. inline
  164. const char *
  165. ConfigValues::ConstIterator::get(Uint32 key, const char * notFound) const {
  166.   Entry tmp;
  167.   if(get(key, &tmp) && tmp.m_type == StringType){
  168.     return tmp.m_string;
  169.   }
  170.   return notFound;
  171. }
  172. inline
  173. ConfigValues::ValueType
  174. ConfigValues::ConstIterator::getTypeOf(Uint32 key) const{
  175.   Entry tmp;
  176.   if(get(key, &tmp)){
  177.     return tmp.m_type;
  178.   }
  179.   return ConfigValues::InvalidType;
  180. }
  181. inline
  182. bool
  183. ConfigValuesFactory::put(Uint32 key, Uint32 val){
  184.   ConfigValues::Entry tmp;
  185.   tmp.m_key = key;
  186.   tmp.m_type = ConfigValues::IntType;
  187.   tmp.m_int = val;
  188.   return put(tmp);
  189. }
  190. inline
  191. bool
  192. ConfigValuesFactory::put64(Uint32 key, Uint64 val){
  193.   ConfigValues::Entry tmp;
  194.   tmp.m_key = key;
  195.   tmp.m_type = ConfigValues::Int64Type;
  196.   tmp.m_int64 = val;
  197.   return put(tmp);
  198. }
  199. inline
  200. bool
  201. ConfigValuesFactory::put(Uint32 key, const char * val){
  202.   ConfigValues::Entry tmp;
  203.   tmp.m_key = key;
  204.   tmp.m_type = ConfigValues::StringType;
  205.   tmp.m_string = val;
  206.   return put(tmp);
  207. }
  208. inline
  209. Uint32
  210. ConfigValues::pack(UtilBuffer& buf) const {
  211.   Uint32 len = getPackedSize();
  212.   void * tmp = buf.append(len);
  213.   if(tmp == 0){
  214.     return 0;
  215.   }
  216.   return pack(tmp, len);
  217. }
  218. inline
  219. bool
  220. ConfigValuesFactory::unpack(const UtilBuffer& buf){
  221.   return unpack(buf.get_data(), buf.length());
  222. }
  223. #endif