summaryrefslogtreecommitdiff
path: root/storage/ndb/include/util/Properties.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/include/util/Properties.hpp')
-rw-r--r--storage/ndb/include/util/Properties.hpp250
1 files changed, 250 insertions, 0 deletions
diff --git a/storage/ndb/include/util/Properties.hpp b/storage/ndb/include/util/Properties.hpp
new file mode 100644
index 00000000000..e6668744211
--- /dev/null
+++ b/storage/ndb/include/util/Properties.hpp
@@ -0,0 +1,250 @@
+/* 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 PROPERTIES_HPP
+#define PROPERTIES_HPP
+
+#include <ndb_global.h>
+#include <BaseString.hpp>
+#include <UtilBuffer.hpp>
+
+enum PropertiesType {
+ PropertiesType_Uint32 = 0,
+ PropertiesType_char = 1,
+ PropertiesType_Properties = 2,
+ PropertiesType_Uint64 = 3
+};
+
+/**
+ * @struct Property
+ * @brief Stores one (name, value)-pair
+ *
+ * Value can be of type Properties, i.e. a Property may contain
+ * a Properties object.
+ */
+struct Property {
+ Property(const char* name, Uint32 val);
+ Property(const char* name, Uint64 val);
+ Property(const char* name, const char * value);
+ Property(const char* name, const class Properties * value);
+ ~Property();
+private:
+ friend class Properties;
+ struct PropertyImpl * impl;
+};
+
+/**
+ * @class Properties
+ * @brief Stores information in (name, value)-pairs
+ */
+class Properties {
+public:
+ static const char delimiter;
+ static const char version[];
+
+ Properties(bool case_insensitive= false);
+ Properties(const Properties &);
+ Properties(const Property *, int len);
+ virtual ~Properties();
+
+ /**
+ * Set/Get wheather names in the Properties should be compared
+ * w/o case.
+ * NOTE: The property is automatically applied to all propoerties put
+ * into this after a called to setCaseInsensitiveNames has been made
+ * But properties already in when calling setCaseInsensitiveNames will
+ * not be affected
+ */
+ void setCaseInsensitiveNames(bool value);
+ bool getCaseInsensitiveNames() const;
+
+ /**
+ * Insert an array of value(s)
+ */
+ void put(const Property *, int len);
+
+ bool put(const char * name, Uint32 value, bool replace = false);
+ bool put64(const char * name, Uint64 value, bool replace = false);
+ bool put(const char * name, const char * value, bool replace = false);
+ bool put(const char * name, const Properties * value, bool replace = false);
+
+ /**
+ * Same as put above,
+ * except that _%d (where %d is a number) is added to the name
+ * Compare get(name, no)
+ */
+ bool put(const char *, Uint32 no, Uint32, bool replace = false);
+ bool put64(const char *, Uint32 no, Uint64, bool replace = false);
+ bool put(const char *, Uint32 no, const char *, bool replace = false);
+ bool put(const char *, Uint32 no, const Properties *, bool replace = false);
+
+
+ bool getTypeOf(const char * name, PropertiesType * type) const;
+
+ /** @return true if Properties object contains name */
+ bool contains(const char * name) const;
+
+ bool get(const char * name, Uint32 * value) const;
+ bool get(const char * name, Uint64 * value) const;
+ bool get(const char * name, const char ** value) const;
+ bool get(const char * name, BaseString & value) const;
+ bool get(const char * name, const Properties ** value) const;
+
+ bool getCopy(const char * name, char ** value) const;
+ bool getCopy(const char * name, Properties ** value) const;
+
+ /**
+ * Same as get above
+ * except that _%d (where %d = no) is added to the name
+ */
+ bool getTypeOf(const char * name, Uint32 no, PropertiesType * type) const;
+ bool contains(const char * name, Uint32 no) const;
+
+ bool get(const char * name, Uint32 no, Uint32 * value) const;
+ bool get(const char * name, Uint32 no, Uint64 * value) const;
+ bool get(const char * name, Uint32 no, const char ** value) const;
+ bool get(const char * name, Uint32 no, const Properties ** value) const;
+
+ bool getCopy(const char * name, Uint32 no, char ** value) const;
+ bool getCopy(const char * name, Uint32 no, Properties ** value) const;
+
+ void clear();
+
+ void remove(const char * name);
+
+ void print(FILE * file = stdout, const char * prefix = 0) const;
+ /**
+ * Iterator over names
+ */
+ class Iterator {
+ public:
+ Iterator(const Properties* prop);
+
+ const char* first();
+ const char* next();
+ private:
+ const Properties* m_prop;
+ Uint32 m_iterator;
+ };
+ friend class Properties::Iterator;
+
+ Uint32 getPackedSize() const;
+ bool pack(Uint32 * buf) const;
+ bool pack(UtilBuffer &buf) const;
+ bool unpack(const Uint32 * buf, Uint32 bufLen);
+ bool unpack(UtilBuffer &buf);
+
+ Uint32 getPropertiesErrno() const { return propErrno; }
+ Uint32 getOSErrno() const { return osErrno; }
+private:
+ Uint32 propErrno;
+ Uint32 osErrno;
+
+ friend class PropertiesImpl;
+ class PropertiesImpl * impl;
+ class Properties * parent;
+
+ void setErrno(Uint32 pErr, Uint32 osErr = 0) const ;
+};
+
+/**
+ * Error code for properties
+ */
+
+/**
+ * No error
+ */
+extern const Uint32 E_PROPERTIES_OK;
+
+/**
+ * Invalid name in put, names can not contain Properties::delimiter
+ */
+extern const Uint32 E_PROPERTIES_INVALID_NAME;
+
+/**
+ * Element did not exist when using get
+ */
+extern const Uint32 E_PROPERTIES_NO_SUCH_ELEMENT;
+
+/**
+ * Element had wrong type when using get
+ */
+extern const Uint32 E_PROPERTIES_INVALID_TYPE;
+
+/**
+ * Element already existed when using put, and replace was not specified
+ */
+extern const Uint32 E_PROPERTIES_ELEMENT_ALREADY_EXISTS;
+
+/**
+ * Invalid version on properties file you are trying to read
+ */
+extern const Uint32 E_PROPERTIES_INVALID_VERSION_WHILE_UNPACKING;
+
+/**
+ * When unpacking an buffer
+ * found that buffer is to short
+ *
+ * Probably an invlaid buffer
+ */
+extern const Uint32 E_PROPERTIES_INVALID_BUFFER_TO_SHORT;
+
+/**
+ * Error when packing, can not allocate working buffer
+ *
+ * Note: OS error is set
+ */
+extern const Uint32 E_PROPERTIES_ERROR_MALLOC_WHILE_PACKING;
+
+/**
+ * Error when unpacking, can not allocate working buffer
+ *
+ * Note: OS error is set
+ */
+extern const Uint32 E_PROPERTIES_ERROR_MALLOC_WHILE_UNPACKING;
+
+/**
+ * Error when unpacking, invalid checksum
+ *
+ */
+extern const Uint32 E_PROPERTIES_INVALID_CHECKSUM;
+
+/**
+ * Error when unpacking
+ * No of items > 0 while size of buffer (left) <= 0
+ */
+extern const Uint32 E_PROPERTIES_BUFFER_TO_SMALL_WHILE_UNPACKING;
+
+inline bool
+Properties::unpack(UtilBuffer &buf) {
+ return unpack((const Uint32 *)buf.get_data(), buf.length());
+}
+
+inline bool
+Properties::pack(UtilBuffer &buf) const {
+ Uint32 size = getPackedSize();
+ void *tmp_buf = buf.append(size);
+ if(tmp_buf == 0)
+ return false;
+ bool ret = pack((Uint32 *)tmp_buf);
+ if(ret == false)
+ return false;
+ return true;
+}
+
+
+
+#endif