diff options
Diffstat (limited to 'CommonLibs/Configuration.h')
-rw-r--r-- | CommonLibs/Configuration.h | 160 |
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 |