Properties.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 PROPERTIES_HPP
  14. #define PROPERTIES_HPP
  15. #include <ndb_global.h>
  16. #include <BaseString.hpp>
  17. #include <UtilBuffer.hpp>
  18. enum PropertiesType {
  19.   PropertiesType_Uint32 = 0,
  20.   PropertiesType_char = 1,
  21.   PropertiesType_Properties = 2,
  22.   PropertiesType_Uint64 = 3
  23. };
  24. /**
  25.  * @struct  Property
  26.  * @brief   Stores one (name, value)-pair
  27.  * 
  28.  * Value can be of type Properties, i.e. a Property may contain 
  29.  * a Properties object.
  30.  */
  31. struct Property {
  32.   Property(const char* name, Uint32 val);
  33.   Property(const char* name, Uint64 val);
  34.   Property(const char* name, const char * value);
  35.   Property(const char* name, const class Properties * value);
  36.   ~Property();
  37. private:
  38.   friend class Properties;
  39.   struct PropertyImpl * impl;
  40. };
  41. /**
  42.  * @class  Properties
  43.  * @brief  Stores information in (name, value)-pairs
  44.  */
  45. class Properties {
  46. public:
  47.   static const char delimiter;
  48.   static const char version[];
  49.   Properties(bool case_insensitive= false);
  50.   Properties(const Properties &);
  51.   Properties(const Property *, int len);
  52.   virtual ~Properties();
  53.   /**
  54.    * Set/Get wheather names in the Properties should be compared 
  55.    * w/o case.
  56.    * NOTE: The property is automatically applied to all propoerties put
  57.    *       into this after a called to setCaseInsensitiveNames has been made
  58.    *       But properties already in when calling setCaseInsensitiveNames will
  59.    *       not be affected
  60.    */
  61.   void setCaseInsensitiveNames(bool value);
  62.   bool getCaseInsensitiveNames() const;
  63.   /**
  64.    * Insert an array of value(s)
  65.    */
  66.   void put(const Property *, int len);
  67.   bool put(const char * name, Uint32 value, bool replace = false);
  68.   bool put64(const char * name, Uint64 value, bool replace = false);
  69.   bool put(const char * name, const char * value, bool replace = false);
  70.   bool put(const char * name, const Properties * value, bool replace = false);
  71.   /**
  72.    * Same as put above,
  73.    *   except that _%d (where %d is a number) is added to the name
  74.    * Compare get(name, no)
  75.    */
  76.   bool put(const char *, Uint32 no, Uint32, bool replace = false);
  77.   bool put64(const char *, Uint32 no, Uint64, bool replace = false);
  78.   bool put(const char *, Uint32 no, const char *, bool replace = false);
  79.   bool put(const char *, Uint32 no, const Properties *, bool replace = false);
  80.   bool getTypeOf(const char * name, PropertiesType * type) const;
  81.   /** @return true if Properties object contains name */
  82.   bool contains(const char * name) const;
  83.   bool get(const char * name, Uint32 * value) const;
  84.   bool get(const char * name, Uint64 * value) const;
  85.   bool get(const char * name, const char ** value) const;
  86.   bool get(const char * name, BaseString & value) const;
  87.   bool get(const char * name, const Properties ** value) const;
  88.   
  89.   bool getCopy(const char * name, char ** value) const;
  90.   bool getCopy(const char * name, Properties ** value) const;
  91.   /**
  92.    * Same as get above
  93.    *   except that _%d (where %d = no) is added to the name
  94.    */
  95.   bool getTypeOf(const char * name, Uint32 no, PropertiesType * type) const;
  96.   bool contains(const char * name, Uint32 no) const;
  97.   bool get(const char * name, Uint32 no, Uint32 * value) const;
  98.   bool get(const char * name, Uint32 no, Uint64 * value) const;
  99.   bool get(const char * name, Uint32 no, const char ** value) const;
  100.   bool get(const char * name, Uint32 no, const Properties ** value) const;
  101.   
  102.   bool getCopy(const char * name, Uint32 no, char ** value) const;
  103.   bool getCopy(const char * name, Uint32 no, Properties ** value) const;
  104.   void clear();
  105.   void remove(const char * name);
  106.   
  107.   void print(FILE * file = stdout, const char * prefix = 0) const;
  108.   /**
  109.    *  Iterator over names 
  110.    */
  111.   class Iterator { 
  112.   public:
  113.     Iterator(const Properties* prop);
  114.     const char* first();
  115.     const char* next();
  116.   private:
  117.     const Properties*  m_prop;
  118.     Uint32 m_iterator;
  119.   };
  120.   friend class Properties::Iterator;
  121.   Uint32 getPackedSize() const;
  122.   bool pack(Uint32 * buf) const;
  123.   bool pack(UtilBuffer &buf) const;
  124.   bool unpack(const Uint32 * buf, Uint32 bufLen);
  125.   bool unpack(UtilBuffer &buf);
  126.   
  127.   Uint32 getPropertiesErrno() const { return propErrno; }
  128.   Uint32 getOSErrno() const { return osErrno; }
  129. private:
  130.   Uint32 propErrno;
  131.   Uint32 osErrno;
  132.   friend class PropertiesImpl;
  133.   class PropertiesImpl * impl;
  134.   class Properties * parent;
  135.   void setErrno(Uint32 pErr, Uint32 osErr = 0) const ;
  136. };
  137. /**
  138.  * Error code for properties
  139.  */
  140. /**
  141.  * No error
  142.  */
  143. extern const Uint32 E_PROPERTIES_OK;
  144. /**
  145.  * Invalid name in put, names can not contain Properties::delimiter
  146.  */
  147. extern const Uint32 E_PROPERTIES_INVALID_NAME;
  148. /**
  149.  * Element did not exist when using get
  150.  */
  151. extern const Uint32 E_PROPERTIES_NO_SUCH_ELEMENT;
  152. /**
  153.  * Element had wrong type when using get
  154.  */
  155. extern const Uint32 E_PROPERTIES_INVALID_TYPE;
  156. /**
  157.  * Element already existed when using put, and replace was not specified
  158.  */
  159. extern const Uint32 E_PROPERTIES_ELEMENT_ALREADY_EXISTS;
  160. /**
  161.  * Invalid version on properties file you are trying to read
  162.  */
  163. extern const Uint32 E_PROPERTIES_INVALID_VERSION_WHILE_UNPACKING;
  164. /**
  165.  * When unpacking an buffer
  166.  *  found that buffer is to short
  167.  *
  168.  * Probably an invlaid buffer
  169.  */
  170. extern const Uint32 E_PROPERTIES_INVALID_BUFFER_TO_SHORT;
  171. /**
  172.  * Error when packing, can not allocate working buffer
  173.  *   
  174.  * Note: OS error is set
  175.  */
  176. extern const Uint32 E_PROPERTIES_ERROR_MALLOC_WHILE_PACKING;
  177. /**
  178.  * Error when unpacking, can not allocate working buffer
  179.  *   
  180.  * Note: OS error is set
  181.  */
  182. extern const Uint32 E_PROPERTIES_ERROR_MALLOC_WHILE_UNPACKING;
  183. /**
  184.  * Error when unpacking, invalid checksum
  185.  *   
  186.  */
  187. extern const Uint32 E_PROPERTIES_INVALID_CHECKSUM;
  188. /**
  189.  * Error when unpacking
  190.  *   No of items > 0 while size of buffer (left) <= 0
  191.  */
  192. extern const Uint32 E_PROPERTIES_BUFFER_TO_SMALL_WHILE_UNPACKING;
  193. inline bool
  194. Properties::unpack(UtilBuffer &buf) {
  195.   return unpack((const Uint32 *)buf.get_data(), buf.length());
  196. }
  197. inline bool
  198. Properties::pack(UtilBuffer &buf) const {
  199.   Uint32 size = getPackedSize();
  200.   void *tmp_buf = buf.append(size);
  201.   if(tmp_buf == 0)
  202.     return false;
  203.   bool ret = pack((Uint32 *)tmp_buf);
  204.   if(ret == false)
  205.     return false;
  206.   return true;
  207. }
  208. #endif