aboutsummaryrefslogtreecommitdiffstats
path: root/CommonLibs/Configuration.h
diff options
context:
space:
mode:
authorkurtis.heimerl <kurtis.heimerl@19bc5d8c-e614-43d4-8b26-e1612bc8e597>2013-05-31 21:47:25 +0000
committerkurtis.heimerl <kurtis.heimerl@19bc5d8c-e614-43d4-8b26-e1612bc8e597>2013-05-31 21:47:25 +0000
commit5a87247fdf2768a6408e0b87c210cebda85bc996 (patch)
treeb538e7e42f8a7ba6c53e1b0bc22bfb359b1e0ef9 /CommonLibs/Configuration.h
parentbec41039bf2ec07c04a6e8b0b586b085ab9cd74c (diff)
syncing commonlibs with Many thanks to Michael Iedema for these patches, makes config a lot better.
git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@5655 19bc5d8c-e614-43d4-8b26-e1612bc8e597
Diffstat (limited to 'CommonLibs/Configuration.h')
-rw-r--r--CommonLibs/Configuration.h160
1 files changed, 126 insertions, 34 deletions
diff --git a/CommonLibs/Configuration.h b/CommonLibs/Configuration.h
index bc37a49..cd4838e 100644
--- a/CommonLibs/Configuration.h
+++ b/CommonLibs/Configuration.h
@@ -33,10 +33,14 @@
#include <assert.h>
#include <stdlib.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <regex.h>
#include <map>
#include <vector>
#include <string>
+#include <sstream>
#include <iostream>
#include <Threads.h>
@@ -165,8 +169,10 @@ class HashString : public std::string {
};
+typedef std::map<std::string, ConfigurationRecord> ConfigurationRecordMap;
typedef std::map<HashString, ConfigurationRecord> ConfigurationMap;
-
+class ConfigurationKey;
+typedef std::map<std::string, ConfigurationKey> ConfigurationKeyMap;
/**
A class for maintaining a configuration key-value table,
@@ -180,40 +186,44 @@ class ConfigurationTable {
sqlite3* mDB; ///< database connection
ConfigurationMap mCache; ///< cache of recently access configuration values
mutable Mutex mLock; ///< control for multithreaded access to the cache
+ std::vector<std::string> (*mCrossCheck)(const std::string&); ///< cross check callback pointer
public:
+ ConfigurationKeyMap mSchema;///< definition of configuration default values and validation logic
+
+ ConfigurationTable(const char* filename = ":memory:", const char *wCmdName = 0, ConfigurationKeyMap wSchema = ConfigurationKeyMap());
- ConfigurationTable(const char* filename = ":memory:", const char *wCmdName = 0);
+ /** Generate an up-to-date example sql file for new installs. */
+ std::string getDefaultSQL(const std::string& program, const std::string& version);
+
+ /** Generate an up-to-date TeX snippet. */
+ std::string getTeX(const std::string& program, const std::string& version);
/** Return true if the key is used in the table. */
bool defines(const std::string& key);
- /** Return true if this key is identified as static. */
- bool isStatic(const std::string& key) const;
+ /** Return true if the application's schema knows about this key. */
+ bool keyDefinedInSchema(const std::string& name);
- /** Return true if this key is identified as required (!optional). */
- bool isRequired(const std::string& key) const;
-
- /**
- Get a string parameter from the table.
- Throw ConfigurationTableKeyNotFound if not found.
- */
- std::string getStr(const std::string& key);
+ /** Return true if the provided value validates correctly against the defined schema. */
+ bool isValidValue(const std::string& name, const std::string& val);
+ /** Return true if the provided value validates correctly against the defined schema. */
+ bool isValidValue(const std::string& name, const int val) { std::stringstream ss; ss << val; return isValidValue(name, ss.str()); }
- /**
- Get a string parameter from the table.
- Define the parameter to the default value if not found.
- */
- std::string getStr(const std::string& key, const char* defaultValue);
+ /** Return a map of all similar keys in the defined schema. */
+ ConfigurationKeyMap getSimilarKeys(const std::string& snippet);
+ /** Return true if this key is identified as static. */
+ bool isStatic(const std::string& key);
/**
- Get a numeric parameter from the table.
+ Get a string parameter from the table.
Throw ConfigurationTableKeyNotFound if not found.
*/
- long getNum(const std::string& key);
+ std::string getStr(const std::string& key);
+
/**
Get a boolean from the table.
@@ -223,9 +233,9 @@ class ConfigurationTable {
/**
Get a numeric parameter from the table.
- Define the parameter to the default value if not found.
+ Throw ConfigurationTableKeyNotFound if not found.
*/
- long getNum(const std::string& key, long defaultValue);
+ long getNum(const std::string& key);
/**
Get a vector of strings from the table.
@@ -233,11 +243,6 @@ class ConfigurationTable {
std::vector<std::string> getVectorOfStrings(const std::string& key);
/**
- Get a vector of strings from the table, with a default value..
- */
- std::vector<std::string> getVectorOfStrings(const std::string& key, const char* defaultValue);
-
- /**
Get a float from the table.
Throw ConfigurationTableKeyNotFound if not found.
*/
@@ -262,14 +267,6 @@ class ConfigurationTable {
bool set(const std::string& key);
/**
- Set a corresponding value to NULL.
- Will not alter required values.
- @param key The key of the item to be nulled-out.
- @return true if anything was actually nulled-out.
- */
- bool unset(const std::string& key);
-
- /**
Remove an entry from the table.
Will not alter required values.
@param key The key of the item to be removed.
@@ -280,9 +277,18 @@ class ConfigurationTable {
/** Search the table, dumping to a stream. */
void find(const std::string& pattern, std::ostream&) const;
+ /** Return all key/value pairs stored in the ConfigurationTable */
+ ConfigurationRecordMap getAllPairs() const;
+
/** Define the callback to purge the cache whenever the database changes. */
void setUpdateHook(void(*)(void *,int ,char const *,char const *,sqlite3_int64));
+ /** Define the callback for cross checking. */
+ void setCrossCheckHook(std::vector<std::string> (*wCrossCheck)(const std::string&));
+
+ /** Execute the application specific value cross checking logic. */
+ std::vector<std::string> crossCheck(const std::string& key);
+
/** purege cache if it exceeds a certain age */
void checkCacheAge();
@@ -323,6 +329,92 @@ class SimpleKeyValue {
};
+class ConfigurationKey {
+
+ public:
+
+ enum VisibilityLevel
+ {
+ CUSTOMER,
+ CUSTOMERSITE,
+ CUSTOMERTUNE,
+ CUSTOMERWARN,
+ DEVELOPER,
+ FACTORY
+ };
+
+ enum Type
+ {
+ BOOLEAN,
+ CHOICE_OPT,
+ CHOICE,
+ CIDR_OPT,
+ CIDR,
+ FILEPATH_OPT,
+ FILEPATH,
+ IPADDRESS_OPT,
+ IPADDRESS,
+ IPANDPORT,
+ MIPADDRESS_OPT,
+ MIPADDRESS,
+ PORT_OPT,
+ PORT,
+ REGEX_OPT,
+ REGEX,
+ STRING_OPT,
+ STRING,
+ VALRANGE
+ };
+
+ private:
+
+ std::string mName;
+ std::string mDefaultValue;
+ std::string mUnits;
+ VisibilityLevel mVisibility;
+ Type mType;
+ std::string mValidValues;
+ bool mIsStatic;
+ std::string mDescription;
+
+
+ public:
+
+ ConfigurationKey(const std::string& wName, const std::string& wDefaultValue, const std::string& wUnits, const VisibilityLevel wVisibility, const Type wType, const std::string& wValidValues, bool wIsStatic, const std::string& wDescription):
+ mName(wName),
+ mDefaultValue(wDefaultValue),
+ mUnits(wUnits),
+ mVisibility(wVisibility),
+ mType(wType),
+ mValidValues(wValidValues),
+ mIsStatic(wIsStatic),
+ mDescription(wDescription)
+ { }
+
+ ConfigurationKey()
+ { }
+
+ const std::string& getName() const { return mName; }
+ const std::string& getDefaultValue() const { return mDefaultValue; }
+ void updateDefaultValue(const std::string& newValue) { mDefaultValue = newValue; }
+ void updateDefaultValue(const int newValue) { std::stringstream ss; ss << newValue; updateDefaultValue(ss.str()); }
+ const std::string& getUnits() const { return mUnits; }
+ const VisibilityLevel& getVisibility() const { return mVisibility; }
+ const Type& getType() const { return mType; }
+ const std::string& getValidValues() const { return mValidValues; }
+ bool isStatic() const { return mIsStatic; }
+ const std::string& getDescription() const { return mDescription; }
+
+ static bool isValidIP(const std::string& ip);
+ static void getMinMaxStepping(const ConfigurationKey &key, std::string &min, std::string &max, std::string &stepping);
+ template<class T> static bool isInValRange(const ConfigurationKey &key, const std::string& val, const bool isInteger);
+ static const std::string visibilityLevelToString(const VisibilityLevel& visibility);
+ static const std::string typeToString(const ConfigurationKey::Type& type);
+ static void printKey(const ConfigurationKey &key, const std::string& currentValue, std::ostream& os);
+ static void printDescription(const ConfigurationKey &key, std::ostream& os);
+ static const std::string getARFCNsString();
+};
+
#endif