mariadb/ndb/include/util/Properties.hpp
2004-10-26 09:48:01 +00:00

250 lines
6.8 KiB
C++

/* 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