Pau Espin Pedrol has submitted this change and it was merged.

Change subject: Remove Configuration module and libsqlite dependency
......................................................................


Remove Configuration module and libsqlite dependency

Change-Id: I823aea91367d586507bbf352f1b6f25bdd635baa
---
M AUTHORS
D CommonLibs/Configuration.cpp
D CommonLibs/Configuration.h
D CommonLibs/ConfigurationTest.cpp
M CommonLibs/Makefile.am
D CommonLibs/sqlite3util.cpp
D CommonLibs/sqlite3util.h
M Makefile.am
M Transceiver52M/Makefile.am
M configure.ac
M debian/control
M debian/copyright
12 files changed, 8 insertions(+), 1,951 deletions(-)

Approvals:
  Vadim Yanitskiy: Looks good to me, but someone else must approve
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/AUTHORS b/AUTHORS
index 65532aa..a956de5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -24,9 +24,6 @@
     CommonLibs/Assert.h
     CommonLibs/BitVector.cpp
     CommonLibs/BitVectorTest.cpp
-    CommonLibs/Configuration.cpp
-    CommonLibs/Configuration.h
-    CommonLibs/ConfigurationTest.cpp
     CommonLibs/Interthread.h
     CommonLibs/InterthreadTest.cpp
     CommonLibs/LinkedLists.cpp
diff --git a/CommonLibs/Configuration.cpp b/CommonLibs/Configuration.cpp
deleted file mode 100644
index 4661903..0000000
--- a/CommonLibs/Configuration.cpp
+++ /dev/null
@@ -1,1160 +0,0 @@
-/*
-* Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
-* Copyright 2010 Kestrel Signal Processing, Inc.
-* Copyright 2011, 2012 Range Networks, Inc.
-*
-*
-* This software is distributed under the terms of the GNU Affero Public 
License.
-* See the COPYING file in the main directory for details.
-*
-* This use of this software may be subject to additional restrictions.
-* See the LEGAL file in the main directory for details.
-
-       This program is free software: you can redistribute it and/or modify
-       it under the terms of the GNU Affero General Public License as 
published by
-       the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-
-       You should have received a copy of the GNU Affero General Public License
-       along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#include "Configuration.h"
-#include "Logger.h"
-#include <fstream>
-#include <iostream>
-#include <string.h>
-
-#ifdef DEBUG_CONFIG
-#define        debugLogEarly gLogEarly
-#else
-#define        debugLogEarly(x,y,z)
-#endif
-
-
-using namespace std;
-
-char gCmdName[20] = {0}; // Use a char* to avoid avoid static initialization 
of string, and race at startup.
-
-static const char* createConfigTable = {
-       "CREATE TABLE IF NOT EXISTS CONFIG ("
-               "KEYSTRING TEXT UNIQUE NOT NULL, "
-               "VALUESTRING TEXT, "
-               "STATIC INTEGER DEFAULT 0, "
-               "OPTIONAL INTEGER DEFAULT 0, "
-               "COMMENTS TEXT DEFAULT ''"
-       ")"
-};
-
-static std::string replaceAll(const std::string input, const std::string 
search, const std::string replace)
-{
-       std::string output = input;
-       size_t index = 0;
-
-       while (true) {
-               index = output.find(search, index);
-               if (index == std::string::npos) {
-                       break;
-               }
-
-               output.replace(index, replace.length(), replace);
-               index += replace.length();
-       }
-
-       return output;
-}
-
-
-float ConfigurationRecord::floatNumber() const
-{
-       float val;
-       sscanf(mValue.c_str(),"%f",&val);
-       return val;
-}
-
-
-ConfigurationTable::ConfigurationTable(const char* filename, const char 
*wCmdName, ConfigurationKeyMap wSchema)
-{
-       gLogEarly(LOG_INFO, "opening configuration table from path %s", 
filename);
-       // Connect to the database.
-       int rc = sqlite3_open(filename,&mDB);
-       // (pat) When I used malloc here, sqlite3 sporadically crashes.
-       if (wCmdName) {
-               strncpy(gCmdName,wCmdName,18);
-               gCmdName[18] = 0;
-               strcat(gCmdName,":");
-       }
-       if (rc) {
-               gLogEarly(LOG_EMERG, "cannot open configuration database at %s, 
error message: %s", filename, sqlite3_errmsg(mDB));
-               sqlite3_close(mDB);
-               mDB = NULL;
-               return;
-       }
-       // Create the table, if needed.
-       if (!sqlite3_command(mDB,createConfigTable)) {
-               gLogEarly(LOG_EMERG, "cannot create configuration table in 
database at %s, error message: %s", filename, sqlite3_errmsg(mDB));
-       }
-
-       // Build CommonLibs schema
-       ConfigurationKey *tmp;
-       tmp = new ConfigurationKey("Log.File","",
-               "",
-               ConfigurationKey::DEVELOPER,
-               ConfigurationKey::FILEPATH_OPT,// audited
-               "",
-               false,
-               "Path to use for textfile based logging.  "
-                       "By default, this feature is disabled.  "
-                       "To enable, specify an absolute path to the file you 
wish to use, eg: /tmp/my-debug.log.  "
-                       "To disable again, execute \"unconfig Log.File\"."
-       );
-       mSchema[tmp->getName()] = *tmp;
-       delete tmp;
-
-       tmp = new ConfigurationKey("Log.Level","NOTICE",
-               "",
-               ConfigurationKey::CUSTOMER,
-               ConfigurationKey::CHOICE,
-               "EMERG|EMERGENCY - report serious faults associated with 
service failure or hardware damage,"
-                       "ALERT|ALERT - report likely service disruption caused 
by misconfiguration or poor connectivity,"
-                       "CRIT|CRITICAL - report anomalous events that are 
likely to degrade service,"
-                       "ERR|ERROR - report internal errors of the software 
that may result in degradation of service in unusual circumstances,"
-                       "WARNING|WARNING - report anomalous events that may 
indicate a degradation of normal service,"
-                       "NOTICE|NOTICE - report anomalous events that probably 
do not affect service but may be of interest to network operators,"
-                       "INFO|INFORMATION - report normal events,"
-                       "DEBUG|DEBUG - only for use by developers and will 
degrade system performance",
-               false,
-               "Default logging level when no other level is defined for a 
file."
-       );
-       mSchema[tmp->getName()] = *tmp;
-       delete tmp;
-
-       // Add application specific schema
-       mSchema.insert(wSchema.begin(), wSchema.end());
-
-       // Init the cross checking callback to something predictable
-       mCrossCheck = NULL;
-}
-
-string ConfigurationTable::getDefaultSQL(const std::string& program, const 
std::string& version)
-{
-       stringstream ss;
-       ConfigurationKeyMap::iterator mp;
-
-       ss << "--" << endl;
-       ss << "-- This file was generated using: " << program << " --gensql" << 
endl;
-       ss << "-- binary version: " << version << endl;
-       ss << "--" << endl;
-       ss << "-- Future changes should not be put in this file directly but" 
<< endl;
-       ss << "-- rather in the program's ConfigurationKey schema." << endl;
-       ss << "--" << endl;
-       ss << "PRAGMA foreign_keys=OFF;" << endl;
-       ss << "BEGIN TRANSACTION;" << endl;
-       ss << "CREATE TABLE CONFIG ( KEYSTRING TEXT UNIQUE NOT NULL, 
VALUESTRING TEXT, STATIC INTEGER DEFAULT 0, OPTIONAL INTEGER DEFAULT 0, 
COMMENTS TEXT DEFAULT '');" << endl;
-
-       mp = mSchema.begin();
-       while (mp != mSchema.end()) {
-               ss << "INSERT INTO \"CONFIG\" VALUES(";
-                       // name
-                       ss << "'" << mp->first << "',";
-                       // default
-                       ss << "'" << mp->second.getDefaultValue() << "',";
-                       // static
-                       if (mp->second.isStatic()) {
-                               ss << "1";
-                       } else {
-                               ss << "0";
-                       }
-                       ss << ",";
-                       // optional
-                       ss << "0,";
-                       // description
-                       ss << "'";
-                       if (mp->second.getType() == ConfigurationKey::BOOLEAN) {
-                               ss << "1=enabled, 0=disabled - ";
-                       }
-                       ss << mp->second.getDescription();
-                       if (mp->second.isStatic()) {
-                               ss << "  Static.";
-                       }
-                       ss << "'";
-               ss << ");" << endl;
-               mp++;
-       }
-
-       ss << "COMMIT;" << endl;
-       ss << endl;
-
-       return ss.str();
-}
-
-string ConfigurationTable::getTeX(const std::string& program, const 
std::string& version)
-{
-       stringstream ss;
-       ConfigurationKeyMap::iterator mp;
-
-       ss << "% START AUTO-GENERATED CONTENT" << endl;
-       ss << "% -- these sections were generated using: " << program << " 
--gentex" << endl;
-       ss << "% -- binary version: " << version << endl;
-
-       ss << "\\subsection{Customer Site Parameters}" << endl;
-       ss << "These parameters must be changed to fit your site." << endl;
-       ss << "\\begin{itemize}" << endl;
-       mp = mSchema.begin();
-       while (mp != mSchema.end()) {
-               if (mp->second.getVisibility() == 
ConfigurationKey::CUSTOMERSITE) {
-                       ss << " \\item ";
-                               // name
-                               ss << mp->first << " -- ";
-                               // description
-                               ss << mp->second.getDescription();
-                       ss << endl;
-               }
-               mp++;
-       }
-       ss << "\\end{itemize}" << endl;
-       ss << endl;
-
-       ss << "\\subsection{Customer Tuneable Parameters}" << endl;
-       ss << "These parameters can be changed to optimize your site." << endl;
-       ss << "\\begin{itemize}" << endl;
-       mp = mSchema.begin();
-       while (mp != mSchema.end()) {
-               if (mp->second.getVisibility() != 
ConfigurationKey::CUSTOMERSITE &&
-                       (
-                               mp->second.getVisibility() == 
ConfigurationKey::CUSTOMER ||
-                               mp->second.getVisibility() == 
ConfigurationKey::CUSTOMERTUNE ||
-                               mp->second.getVisibility() == 
ConfigurationKey::CUSTOMERWARN
-                       )) {
-                       ss << " \\item ";
-                               // name
-                               ss << mp->first << " -- ";
-                               // description
-                               ss << mp->second.getDescription();
-                       ss << endl;
-               }
-               mp++;
-       }
-       ss << "\\end{itemize}" << endl;
-       ss << endl;
-
-       ss << "\\subsection{Developer/Factory Parameters}" << endl;
-       ss << "These parameters should only be changed by when developing new 
code." << endl;
-       ss << "\\begin{itemize}" << endl;
-       mp = mSchema.begin();
-       while (mp != mSchema.end()) {
-               if (mp->second.getVisibility() == ConfigurationKey::FACTORY ||
-                       mp->second.getVisibility() == 
ConfigurationKey::DEVELOPER) {
-                       ss << " \\item ";
-                               // name
-                               ss << mp->first << " -- ";
-                               // description
-                               ss << mp->second.getDescription();
-                       ss << endl;
-               }
-               mp++;
-       }
-       ss << "\\end{itemize}" << endl;
-       ss << "% END AUTO-GENERATED CONTENT" << endl;
-       ss << endl;
-
-       string tmp = replaceAll(ss.str(), "^", "\\^");
-       return replaceAll(tmp, "_", "\\_");
-}
-
-bool ConfigurationTable::defines(const string& key)
-{
-       try {
-               ScopedLock lock(mLock);
-               return lookup(key).defined();
-       } catch (ConfigurationTableKeyNotFound) {
-               debugLogEarly(LOG_ALERT, "configuration parameter %s not 
found", key.c_str());
-               return false;
-       }
-}
-
-bool ConfigurationTable::keyDefinedInSchema(const std::string& name)
-{
-       return mSchema.find(name) == mSchema.end() ? false : true;
-}
-
-bool ConfigurationTable::isValidValue(const std::string& name, const 
std::string& val) {
-       bool ret = false;
-
-       ConfigurationKey key = mSchema[name];
-
-       switch (key.getType()) {
-               case ConfigurationKey::BOOLEAN: {
-                       if (val == "1" || val == "0") {
-                               ret = true;
-                       }
-                       break;
-               }
-
-               case ConfigurationKey::CHOICE_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::CHOICE: {
-                       int startPos = -1;
-                       uint endPos = 0;
-
-                       std::string tmp = key.getValidValues();
-
-                       do {
-                               startPos++;
-                               if ((endPos = tmp.find('|', startPos)) != 
std::string::npos) {
-                                       if (val == tmp.substr(startPos, 
endPos-startPos)) {
-                                               ret = true;
-                                               break;
-                                       }
-                               } else {
-                                       if (val == tmp.substr(startPos, 
tmp.find(',', startPos)-startPos)) {
-                                               ret = true;
-                                               break;
-                                       }
-                               }
-
-                       } while ((startPos = tmp.find(',', startPos)) != 
(int)std::string::npos);
-                       break;
-               }
-
-               case ConfigurationKey::CIDR_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::CIDR: {
-                       uint delimiter;
-                       std::string ip;
-                       int cidr = -1;
-
-                       delimiter = val.find('/');
-                       if (delimiter != std::string::npos) {
-                               ip = val.substr(0, delimiter);
-                               std::stringstream(val.substr(delimiter+1)) >> 
cidr;
-                               if (ConfigurationKey::isValidIP(ip) && 0 <= 
cidr && cidr <= 32) {
-                                       ret = true;
-                               }
-                       }
-                       break;
-               }
-
-               case ConfigurationKey::FILEPATH_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::FILEPATH: {
-                       regex_t r;
-                       const char* expression = "^[a-zA-Z0-9/_.-]+$";
-                       int result = regcomp(&r, expression, REG_EXTENDED);
-                       if (result) {
-                               char msg[256];
-                               regerror(result,&r,msg,255);
-                               break;//abort();
-                       }
-                       if (regexec(&r, val.c_str(), 0, NULL, 0)==0) {
-                               ret = true;
-                       }
-                       regfree(&r);
-                       break;
-               }
-
-               case ConfigurationKey::IPADDRESS_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::IPADDRESS: {
-                       ret = ConfigurationKey::isValidIP(val);
-                       break;
-               }
-
-               case ConfigurationKey::IPANDPORT: {
-                       uint delimiter;
-                       std::string ip;
-                       int port = -1;
-
-                       delimiter = val.find(':');
-                       if (delimiter != std::string::npos) {
-                               ip = val.substr(0, delimiter);
-                               std::stringstream(val.substr(delimiter+1)) >> 
port;
-                               if (ConfigurationKey::isValidIP(ip) && 1 <= 
port && port <= 65535) {
-                                       ret = true;
-                               }
-                       }
-                       break;
-               }
-
-               case ConfigurationKey::MIPADDRESS_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::MIPADDRESS: {
-                       int startPos = -1;
-                       uint endPos = 0;
-
-                       do {
-                               startPos++;
-                               endPos = val.find(' ', startPos);
-                               if 
(ConfigurationKey::isValidIP(val.substr(startPos, endPos-startPos))) {
-                                       ret = true;
-                               } else {
-                                       ret = false;
-                                       break;
-                               }
-
-                       } while ((startPos = endPos) != (int)std::string::npos);
-                       break;
-               }
-
-               case ConfigurationKey::PORT_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::PORT: {
-                       int intVal;
-
-                       std::stringstream(val) >> intVal;
-
-                       if (1 <= intVal && intVal <= 65535) {
-                               ret = true;
-                       }
-                       break;
-               }
-
-               case ConfigurationKey::REGEX_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::REGEX: {
-                       regex_t r;
-                       const char* expression = val.c_str();
-                       int result = regcomp(&r, expression, REG_EXTENDED);
-                       if (result) {
-                               char msg[256];
-                               regerror(result,&r,msg,255);
-                       } else {
-                               ret = true;
-                       }
-                       regfree(&r);
-                       break;
-               }
-
-               case ConfigurationKey::STRING_OPT: {
-                       if (val.length() == 0) {
-                               ret = true;
-                               break;
-                       }
-               }
-               case ConfigurationKey::STRING: {
-                       regex_t r;
-                       const char* expression = key.getValidValues().c_str();
-                       int result = regcomp(&r, expression, REG_EXTENDED);
-                       if (result) {
-                               char msg[256];
-                               regerror(result,&r,msg,255);
-                               break;//abort();
-                       }
-                       if (regexec(&r, val.c_str(), 0, NULL, 0)==0) {
-                               ret = true;
-                       }
-                       regfree(&r);
-                       break;
-               }
-
-               case ConfigurationKey::VALRANGE: {
-                       regex_t r;
-                       int result;
-                       if (key.getValidValues().find('.') != 
std::string::npos) {
-                               result = regcomp(&r, "^[0-9.-]+$", 
REG_EXTENDED);
-                       } else {
-                               result = regcomp(&r, "^[0-9-]+$", REG_EXTENDED);
-                       }
-                       if (result) {
-                               char msg[256];
-                               regerror(result,&r,msg,255);
-                               break;//abort();
-                       }
-                       if (regexec(&r, val.c_str(), 0, NULL, 0)!=0) {
-                               ret = false;
-                       } else if (key.getValidValues().find('.') != 
std::string::npos) {
-                               ret = 
ConfigurationKey::isInValRange<float>(key, val, false);
-                       } else {
-                               ret = ConfigurationKey::isInValRange<int>(key, 
val, true);
-                       }
-
-                       regfree(&r);
-                       break;
-               }
-       }
-
-       return ret;
-}
-
-ConfigurationKeyMap ConfigurationTable::getSimilarKeys(const std::string& 
snippet) {
-       ConfigurationKeyMap tmp;
-
-       ConfigurationKeyMap::const_iterator mp = mSchema.begin();
-       while (mp != mSchema.end()) {
-               if (mp->first.find(snippet) != std::string::npos) {
-                       tmp[mp->first] = mp->second;
-               }
-               mp++;
-       }
-
-       return tmp;
-}
-
-const ConfigurationRecord& ConfigurationTable::lookup(const string& key)
-{
-       assert(mDB);
-       checkCacheAge();
-       // We assume the caller holds mLock.
-       // So it is OK to return a reference into the cache.
-
-       // Check the cache.
-       // This is cheap.
-       ConfigurationMap::const_iterator where = mCache.find(key);
-       if (where!=mCache.end()) {
-               if (where->second.defined()) return where->second;
-               throw ConfigurationTableKeyNotFound(key);
-       }
-
-       // Check the database.
-       // This is more expensive.
-       char *value = NULL;
-       sqlite3_single_lookup(mDB,"CONFIG",
-                       "KEYSTRING",key.c_str(),"VALUESTRING",value);
-
-       // value found, cache the result
-       if (value) {
-               mCache[key] = ConfigurationRecord(value);
-       // key definition found, cache the default
-       } else if (keyDefinedInSchema(key)) {
-               mCache[key] = 
ConfigurationRecord(mSchema[key].getDefaultValue());
-       // total miss, cache the error
-       } else {
-               mCache[key] = ConfigurationRecord(false);
-               throw ConfigurationTableKeyNotFound(key);
-       }
-
-       free(value);
-
-       // Leave mLock locked.  The caller holds it still.
-       return mCache[key];
-}
-
-
-
-bool ConfigurationTable::isStatic(const string& key)
-{
-       if (keyDefinedInSchema(key)) {
-               return mSchema[key].isStatic();
-       } else {
-               return false;
-       }
-}
-
-
-
-
-string ConfigurationTable::getStr(const string& key)
-{
-       // We need the lock because rec is a reference into the cache.
-       try {
-               ScopedLock lock(mLock);
-               return lookup(key).value();
-       } catch (ConfigurationTableKeyNotFound) {
-               // Raise an alert and re-throw the exception.
-               debugLogEarly(LOG_ALERT, "configuration parameter %s has no 
defined value", key.c_str());
-               throw ConfigurationTableKeyNotFound(key);
-       }
-}
-
-
-bool ConfigurationTable::getBool(const string& key)
-{
-       try {
-               return getNum(key) != 0;
-       } catch (ConfigurationTableKeyNotFound) {
-               // Raise an alert and re-throw the exception.
-               debugLogEarly(LOG_ALERT, "configuration parameter %s has no 
defined value", key.c_str());
-               throw ConfigurationTableKeyNotFound(key);
-       }
-}
-
-
-long ConfigurationTable::getNum(const string& key)
-{
-       // We need the lock because rec is a reference into the cache.
-       try {
-               ScopedLock lock(mLock);
-               return lookup(key).number();
-       } catch (ConfigurationTableKeyNotFound) {
-               // Raise an alert and re-throw the exception.
-               debugLogEarly(LOG_ALERT, "configuration parameter %s has no 
defined value", key.c_str());
-               throw ConfigurationTableKeyNotFound(key);
-       }
-}
-
-
-float ConfigurationTable::getFloat(const string& key)
-{
-       try {
-               ScopedLock lock(mLock);
-               return lookup(key).floatNumber();
-       } catch (ConfigurationTableKeyNotFound) {
-               // Raise an alert and re-throw the exception.
-               debugLogEarly(LOG_ALERT, "configuration parameter %s has no 
defined value", key.c_str());
-               throw ConfigurationTableKeyNotFound(key);
-       }
-}
-
-std::vector<string> ConfigurationTable::getVectorOfStrings(const string& key)
-{
-       // Look up the string.
-       char *line=NULL;
-       try {
-               ScopedLock lock(mLock);
-               const ConfigurationRecord& rec = lookup(key);
-               line = strdup(rec.value().c_str());
-       } catch (ConfigurationTableKeyNotFound) {
-               // Raise an alert and re-throw the exception.
-               debugLogEarly(LOG_ALERT, "configuration parameter %s has no 
defined value", key.c_str());
-               throw ConfigurationTableKeyNotFound(key);
-       }
-
-       assert(line);
-       char *lp = line;
-       
-       // Parse the string.
-       std::vector<string> retVal;
-       while (lp) {
-               while (*lp==' ') lp++;
-               if (*lp == '\0') break;
-               char *tp = strsep(&lp," ");
-               if (!tp) break;
-               retVal.push_back(tp);
-       }
-       free(line);
-       return retVal;
-}
-
-
-std::vector<unsigned> ConfigurationTable::getVector(const string& key)
-{
-       // Look up the string.
-       char *line=NULL;
-       try {
-               ScopedLock lock(mLock);
-               const ConfigurationRecord& rec = lookup(key);
-               line = strdup(rec.value().c_str());
-       } catch (ConfigurationTableKeyNotFound) {
-               // Raise an alert and re-throw the exception.
-               debugLogEarly(LOG_ALERT, "configuration parameter %s has no 
defined value", key.c_str());
-               throw ConfigurationTableKeyNotFound(key);
-       }
-
-       assert(line);
-       char *lp = line;
-
-       // Parse the string.
-       std::vector<unsigned> retVal;
-       while (lp) {
-               // Watch for multiple or trailing spaces.
-               while (*lp==' ') lp++;
-               if (*lp=='\0') break;
-               retVal.push_back(strtol(lp,NULL,0));
-               strsep(&lp," ");
-       }
-       free(line);
-       return retVal;
-}
-
-
-bool ConfigurationTable::remove(const string& key)
-{
-       assert(mDB);
-
-       ScopedLock lock(mLock);
-       // Clear the cache entry and the database.
-       ConfigurationMap::iterator where = mCache.find(key);
-       if (where!=mCache.end()) mCache.erase(where);
-       // Really remove it.
-       string cmd = "DELETE FROM CONFIG WHERE KEYSTRING=='"+key+"'";
-       return sqlite3_command(mDB,cmd.c_str());
-}
-
-
-
-void ConfigurationTable::find(const string& pat, ostream& os) const
-{
-       // Prepare the statement.
-       string cmd = "SELECT KEYSTRING,VALUESTRING FROM CONFIG WHERE KEYSTRING 
LIKE \"%" + pat + "%\"";
-       sqlite3_stmt *stmt;
-       if (sqlite3_prepare_statement(mDB,&stmt,cmd.c_str())) return;
-       // Read the result.
-       int src = sqlite3_run_query(mDB,stmt);
-       while (src==SQLITE_ROW) {
-               const char* value = (const char*)sqlite3_column_text(stmt,1);
-               os << sqlite3_column_text(stmt,0) << " ";
-               int len = 0;
-               if (value) {
-                       len = strlen(value);
-               }
-               if (len && value) os << value << endl;
-               else os << "(disabled)" << endl;
-               src = sqlite3_run_query(mDB,stmt);
-       }
-       sqlite3_finalize(stmt);
-}
-
-
-ConfigurationRecordMap ConfigurationTable::getAllPairs() const
-{
-       ConfigurationRecordMap tmp;
-
-       // Prepare the statement.
-       string cmd = "SELECT KEYSTRING,VALUESTRING FROM CONFIG";
-       sqlite3_stmt *stmt;
-       if (sqlite3_prepare_statement(mDB,&stmt,cmd.c_str())) return tmp;
-       // Read the result.
-       int src = sqlite3_run_query(mDB,stmt);
-       while (src==SQLITE_ROW) {
-               const char* key = (const char*)sqlite3_column_text(stmt,0);
-               const char* value = (const char*)sqlite3_column_text(stmt,1);
-               if (key && value) {
-                       tmp[string(key)] = ConfigurationRecord(value);
-               } else if (key && !value) {
-                       tmp[string(key)] = ConfigurationRecord(false);
-               }
-               src = sqlite3_run_query(mDB,stmt);
-       }
-       sqlite3_finalize(stmt);
-
-       return tmp;
-}
-
-bool ConfigurationTable::set(const string& key, const string& value)
-{
-       assert(mDB);
-       ScopedLock lock(mLock);
-       string cmd = "INSERT OR REPLACE INTO CONFIG 
(KEYSTRING,VALUESTRING,OPTIONAL) VALUES (\"" + key + "\",\"" + value + "\",1)";
-       bool success = sqlite3_command(mDB,cmd.c_str());
-       // Cache the result.
-       if (success) mCache[key] = ConfigurationRecord(value);
-       return success;
-}
-
-bool ConfigurationTable::set(const string& key, long value)
-{
-       char buffer[30];
-       sprintf(buffer,"%ld",value);
-       return set(key,buffer);
-}
-
-
-bool ConfigurationTable::set(const string& key)
-{
-       assert(mDB);
-       ScopedLock lock(mLock);
-       string cmd = "INSERT OR REPLACE INTO CONFIG 
(KEYSTRING,VALUESTRING,OPTIONAL) VALUES (\"" + key + "\",NULL,1)";
-       bool success = sqlite3_command(mDB,cmd.c_str());
-       if (success) mCache[key] = ConfigurationRecord(true);
-       return success;
-}
-
-
-void ConfigurationTable::checkCacheAge()
-{
-       // mLock is set by caller 
-       static time_t timeOfLastPurge = 0;
-       time_t now = time(NULL);
-       // purge every 3 seconds
-       // purge period cannot be configuration parameter
-       if (now - timeOfLastPurge < 3) return;
-       timeOfLastPurge = now;
-       // this is purge() without the lock
-       ConfigurationMap::iterator mp = mCache.begin();
-       while (mp != mCache.end()) {
-               ConfigurationMap::iterator prev = mp;
-               mp++;
-               mCache.erase(prev);
-       }
-}
-
-
-void ConfigurationTable::purge()
-{
-       ScopedLock lock(mLock);
-       ConfigurationMap::iterator mp = mCache.begin();
-       while (mp != mCache.end()) {
-               ConfigurationMap::iterator prev = mp;
-               mp++;
-               mCache.erase(prev);
-       }
-}
-
-
-void ConfigurationTable::setUpdateHook(void(*func)(void *,int ,char const 
*,char const *,sqlite3_int64))
-{
-       assert(mDB);
-       sqlite3_update_hook(mDB,func,NULL);
-}
-
-
-void ConfigurationTable::setCrossCheckHook(vector<string> (*wCrossCheck)(const 
string&))
-{
-       mCrossCheck = wCrossCheck;
-}
-
-
-vector<string> ConfigurationTable::crossCheck(const string& key) {
-       vector<string> ret;
-
-       if (mCrossCheck != NULL) {
-               ret = mCrossCheck(key);
-       }
-
-       return ret;
-}
-
-void HashString::computeHash()
-{
-       // FIXME -- Someone needs to review this hash function.
-       const char* cstr = c_str();
-       mHash = 0;
-       for (unsigned i=0; i<size(); i++) {
-               mHash = mHash ^ (mHash >> 32);
-               mHash = mHash*127 + cstr[i];
-       }
-}
-
-
-void SimpleKeyValue::addItem(const char* pair_orig)
-{
-       char *pair = strdup(pair_orig);
-       char *key = pair;
-       char *mark = strchr(pair,'=');
-       if (!mark) return;
-       *mark = '\0';
-       char *value = mark+1;
-       mMap[key] = value;
-       free(pair);
-}
-
-
-
-const char* SimpleKeyValue::get(const char* key) const
-{
-       HashStringMap::const_iterator p = mMap.find(key);
-       if (p==mMap.end()) return NULL;
-       return p->second.c_str();
-}
-
-
-void SimpleKeyValue::addItems(const char* pairs_orig)
-{
-       char *pairs = strdup(pairs_orig);
-       char *thisPair;
-       while ((thisPair=strsep(&pairs," "))!=NULL) {
-               addItem(thisPair);
-       }
-       free(pairs);
-}
-
-
-bool ConfigurationKey::isValidIP(const std::string& ip) {
-       struct sockaddr_in sa;
-       return inet_pton(AF_INET, ip.c_str(), &(sa.sin_addr)) != 0;
-}
-
-
-void ConfigurationKey::getMinMaxStepping(const ConfigurationKey &key, 
std::string &min, std::string &max, std::string &stepping) {
-       uint delimiter;
-       int startPos;
-       uint endPos;
-
-       std::string tmp = key.getValidValues();
-       stepping = "1";
-
-       // grab steps if they're defined
-       startPos = tmp.find('(');
-       if (startPos != (int)std::string::npos) {
-               endPos = tmp.find(')');
-               stepping = tmp.substr(startPos+1, endPos-startPos-1);
-               tmp = tmp.substr(0, startPos);
-       }
-       startPos = 0;
-
-       delimiter = tmp.find(':', startPos);
-       min = tmp.substr(startPos, delimiter-startPos);
-       max = tmp.substr(delimiter+1, tmp.find(',', delimiter)-delimiter-1);
-}
-
-
-template<class T> bool ConfigurationKey::isInValRange(const ConfigurationKey 
&key, const std::string& val, const bool isInteger) {
-       bool ret = false;
-
-       T convVal;
-       T min;
-       T max;
-       T steps;
-       std::string strMin;
-       std::string strMax;
-       std::string strSteps;
-
-       std::stringstream(val) >> convVal;
-
-       ConfigurationKey::getMinMaxStepping(key, strMin, strMax, strSteps);
-       std::stringstream(strMin) >> min;
-       std::stringstream(strMax) >> max;
-       std::stringstream(strSteps) >> steps;
-
-       // TODO : only ranges checked, steps not enforced
-       if (isInteger) {
-               if (val.find('.') == std::string::npos && min <= convVal && 
convVal <= max) {
-                       ret = true;
-               }
-       } else {
-               if (min <= convVal && convVal <= max) {
-                       ret = true;
-               }
-       }
-
-       return ret;
-}
-
-const std::string ConfigurationKey::getARFCNsString() {
-       stringstream ss;
-       int i;
-       float downlink;
-       float uplink;
-
-       // 128:251 GSM850
-       downlink = 869.2;
-       uplink = 824.2;
-       for (i = 128; i <= 251; i++) {
-               ss << i << "|GSM850 #" << i << " : " << downlink << " MHz 
downlink / " << uplink << " MHz uplink,";
-               downlink += 0.2;
-               uplink += 0.2;
-       }
-
-       // 1:124 PGSM900
-       downlink = 935.2;
-       uplink = 890.2;
-       for (i = 1; i <= 124; i++) {
-               ss << i << "|PGSM900 #" << i << " : " << downlink << " MHz 
downlink / " << uplink << " MHz uplink,";
-               downlink += 0.2;
-               uplink += 0.2;
-       }
-
-       // 512:885 DCS1800
-       downlink = 1805.2;
-       uplink = 1710.2;
-       for (i = 512; i <= 885; i++) {
-               ss << i << "|DCS1800 #" << i << " : " << downlink << " MHz 
downlink / " << uplink << " MHz uplink,";
-               downlink += 0.2;
-               uplink += 0.2;
-       }
-
-       // 512:810 PCS1900
-       downlink = 1930.2;
-       uplink = 1850.2;
-       for (i = 512; i <= 810; i++) {
-               ss << i << "|PCS1900 #" << i << " : " << downlink << " MHz 
downlink / " << uplink << " MHz uplink,";
-               downlink += 0.2;
-               uplink += 0.2;
-       }
-
-       ss << endl;
-
-       return ss.str();
-}
-
-const std::string ConfigurationKey::visibilityLevelToString(const 
ConfigurationKey::VisibilityLevel& visibility) {
-       std::string ret = "UNKNOWN ERROR";
-
-       switch (visibility) {
-               case ConfigurationKey::CUSTOMER:
-                       ret = "customer - can be freely changed by the customer 
without any detriment to their system";
-                       break;
-               case ConfigurationKey::CUSTOMERSITE:
-                       ret = "customer site - these values are different for 
each BTS and should not be left default";
-                       break;
-               case ConfigurationKey::CUSTOMERTUNE:
-                       ret = "customer tune - should only be changed to tune 
an installation to better suit the physical environment or MS usage pattern";
-                       break;
-               case ConfigurationKey::CUSTOMERWARN:
-                       ret = "customer warn - a warning will be presented and 
confirmation required before changing this sensitive setting";
-                       break;
-               case ConfigurationKey::DEVELOPER:
-                       ret = "developer - should only be changed by developers 
to debug/optimize the implementation";
-                       break;
-               case ConfigurationKey::FACTORY:
-                       ret = "factory - set once at the factory, should never 
be changed";
-                       break;
-       }
-
-       return ret;
-}
-
-const std::string ConfigurationKey::typeToString(const ConfigurationKey::Type& 
type) {
-       std::string ret = "UNKNOWN ERROR";
-
-       switch (type) {
-               case BOOLEAN:
-                       ret = "boolean";
-                       break;
-               case CHOICE_OPT:
-                       ret = "multiple choice (optional)";
-                       break;
-               case CHOICE:
-                       ret = "multiple choice";
-                       break;
-               case CIDR_OPT:
-                       ret = "CIDR notation (optional)";
-                       break;
-               case CIDR:
-                       ret = "CIDR notation";
-                       break;
-               case FILEPATH_OPT:
-                       ret = "file path (optional)";
-                       break;
-               case FILEPATH:
-                       ret = "file path";
-                       break;
-               case IPADDRESS_OPT:
-                       ret = "IP address (optional)";
-                       break;
-               case IPADDRESS:
-                       ret = "IP address";
-                       break;
-               case IPANDPORT:
-                       ret = "IP address and port";
-                       break;
-               case MIPADDRESS_OPT:
-                       ret = "space-separated list of IP addresses (optional)";
-                       break;
-               case MIPADDRESS:
-                       ret = "space-separated list of IP addresses";
-                       break;
-               case PORT_OPT:
-                       ret = "IP port (optional)";
-                       break;
-               case PORT:
-                       ret = "IP port";
-                       break;
-               case REGEX_OPT:
-                       ret = "regular expression (optional)";
-                       break;
-               case REGEX:
-                       ret = "regular expression";
-                       break;
-               case STRING_OPT:
-                       ret = "string (optional)";
-                       break;
-               case STRING:
-                       ret = "string";
-                       break;
-               case VALRANGE:
-                       ret = "value range";
-                       break;
-       }
-
-       return ret;
-}
-
-void ConfigurationKey::printKey(const ConfigurationKey &key, const 
std::string& currentValue, ostream& os) {
-       os << key.getName() << " ";
-       if (!currentValue.length()) {
-               os << "(disabled)";
-       } else {
-               os << currentValue;
-       }
-       if (currentValue.compare(key.getDefaultValue()) == 0) {
-               os << "     [default]";
-       }
-       os << endl;
-}
-
-void ConfigurationKey::printDescription(const ConfigurationKey &key, ostream& 
os) {
-       std::string tmp;
-
-       os << " - description:      " << key.getDescription() << std::endl;
-       if (key.getUnits().length()) {
-               os << " - units:            " << key.getUnits() << std::endl;
-       }
-       os << " - type:             " << 
ConfigurationKey::typeToString(key.getType()) << std::endl;
-       if (key.getDefaultValue().length()) {
-               os << " - default value:    " << key.getDefaultValue() << 
std::endl;
-       }
-       os << " - visibility level: " << 
ConfigurationKey::visibilityLevelToString(key.getVisibility()) << std::endl;
-       os << " - static:           " << key.isStatic() << std::endl;
-
-       tmp = key.getValidValues();
-       if (key.getType() == ConfigurationKey::VALRANGE) {
-               int startPos = tmp.find('(');
-               uint delimiter = 0;
-               if (startPos != (int)std::string::npos) {
-                       tmp = tmp.substr(0, startPos);
-               }
-               startPos = -1;
-
-               do {
-                       startPos++;
-                       delimiter = tmp.find(':', startPos);
-                       os << " - valid values:     " << "from " << 
tmp.substr(startPos, delimiter-startPos) << " to "
-                               << tmp.substr(delimiter+1, tmp.find(',', 
delimiter)-delimiter-1) << std::endl;
-
-               } while ((startPos = tmp.find(',', startPos)) != 
(int)std::string::npos);
-
-       } else if (key.getType() == ConfigurationKey::CHOICE) {
-               int startPos = -1;
-               uint endPos = 0;
-
-               do {
-                       startPos++;
-                       if ((endPos = tmp.find('|', startPos)) != 
std::string::npos) {
-                               os << " - valid values:     " << 
tmp.substr(startPos, endPos-startPos);
-                               os << " = " << tmp.substr(endPos+1, 
tmp.find(',', endPos)-endPos-1) << std::endl;
-                       } else {
-                               os << " - valid values:     " << 
tmp.substr(startPos, tmp.find(',', startPos)-startPos) << std::endl;
-                       }
-
-               } while ((startPos = tmp.find(',', startPos)) != 
(int)std::string::npos);
-
-       } else if (key.getType() == ConfigurationKey::BOOLEAN) {
-               os << " - valid values:     0 = disabled" << std::endl;
-               os << " - valid values:     1 = enabled" << std::endl;
-
-       } else if (key.getType() == ConfigurationKey::STRING) {
-               os << " - valid val regex:  " << tmp << std::endl;
-
-       } else if (key.getValidValues().length()) {
-               os << " - raw valid values: " << tmp << std::endl;
-       }
-}
-
-
-// vim: ts=4 sw=4
diff --git a/CommonLibs/Configuration.h b/CommonLibs/Configuration.h
deleted file mode 100644
index cd4838e..0000000
--- a/CommonLibs/Configuration.h
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
-* Copyright 2009, 2010 Free Software Foundation, Inc.
-* Copyright 2010 Kestrel Signal Processing, Inc.
-* Copyright 2011, 2012 Range Networks, Inc.
-*
-* This software is distributed under the terms of the GNU Affero Public 
License.
-* See the COPYING file in the main directory for details.
-*
-* This use of this software may be subject to additional restrictions.
-* See the LEGAL file in the main directory for details.
-
-       This program is free software: you can redistribute it and/or modify
-       it under the terms of the GNU Affero General Public License as 
published by
-       the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-
-       You should have received a copy of the GNU Affero General Public License
-       along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#ifndef CONFIGURATION_H
-#define CONFIGURATION_H
-
-
-#include "sqlite3util.h"
-
-#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>
-#include <stdint.h>
-
-
-/** A class for configuration file errors. */
-class ConfigurationTableError {};
-extern char gCmdName[];        // Gotta be global, gotta be char*, gotta love 
it.
-
-/** An exception thrown when a given config key isn't found. */
-class ConfigurationTableKeyNotFound : public ConfigurationTableError {
-
-       private:
-
-       std::string mKey;
-
-       public:
-
-       ConfigurationTableKeyNotFound(const std::string& wKey)
-               :mKey(wKey)
-       { }
-
-       const std::string& key() const { return mKey; }
-
-};
-
-
-class ConfigurationRecord {
-
-       private:
-
-       std::string mValue;
-       long mNumber;
-       bool mDefined;
-
-       public:
-
-       ConfigurationRecord(bool wDefined=true):
-               mDefined(wDefined)
-       { }
-
-       ConfigurationRecord(const std::string& wValue):
-               mValue(wValue),
-               mNumber(strtol(wValue.c_str(),NULL,0)),
-               mDefined(true)
-       { }
-
-       ConfigurationRecord(const char* wValue):
-               mValue(std::string(wValue)),
-               mNumber(strtol(wValue,NULL,0)),
-               mDefined(true)
-       { }
-
-
-       const std::string& value() const { return mValue; }
-       long number() const { return mNumber; }
-       bool defined() const { return mDefined; }
-
-       float floatNumber() const;
-
-};
-
-
-/** A string class that uses a hash function for comparison. */
-class HashString : public std::string {
-
-
-       protected:
-
-       uint64_t mHash;
-
-       void computeHash();
-
-
-       public:
-
-       HashString(const char* src)
-               :std::string(src)
-       {
-               computeHash();
-       }
-
-       HashString(const std::string& src)
-               :std::string(src)
-       {
-               computeHash();
-       }
-
-       HashString()
-       {
-               mHash=0;
-       }
-
-       HashString& operator=(std::string& src)
-       {
-               std::string::operator=(src);
-               computeHash();
-               return *this;
-       }
-
-       HashString& operator=(const char* src)
-       {
-               std::string::operator=(src);
-               computeHash();
-               return *this;
-       }
-
-       bool operator==(const HashString& other)
-       {
-               return mHash==other.mHash;
-       }
-
-       bool operator<(const HashString& other)
-       {
-               return mHash<other.mHash;
-       }
-
-       bool operator>(const HashString& other)
-       {
-               return mHash<other.mHash;
-       }
-
-       uint64_t hash() const { return mHash; }
-
-};
-
-
-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,
-       based on sqlite3 and a local map-based cache.
-       Thread-safe, too.
-*/
-class ConfigurationTable {
-
-       private:
-
-       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());
-
-       /** 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 the application's schema knows about this key. */
-       bool keyDefinedInSchema(const std::string& name);
-
-       /** 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()); }
-
-       /** 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 string parameter from the table.
-               Throw ConfigurationTableKeyNotFound if not found.
-       */
-       std::string getStr(const std::string& key);
-
-
-       /**
-               Get a boolean from the table.
-               Return false if NULL or 0, true otherwise.
-       */
-       bool getBool(const std::string& key);
-
-       /**
-               Get a numeric parameter from the table.
-               Throw ConfigurationTableKeyNotFound if not found.
-       */
-       long getNum(const std::string& key);
-
-       /**
-               Get a vector of strings from the table.
-       */
-       std::vector<std::string> getVectorOfStrings(const std::string& key);
-
-       /**
-               Get a float from the table.
-               Throw ConfigurationTableKeyNotFound if not found.
-       */
-       float getFloat(const std::string& key);
-
-       /**
-               Get a numeric vector from the table.
-       */
-       std::vector<unsigned> getVector(const std::string& key);
-
-       /** Get length of a vector */
-       unsigned getVectorLength(const std::string &key) 
-               { return getVector(key).size(); }
-
-       /** Set or change a value in the table.  */
-       bool set(const std::string& key, const std::string& value);
-
-       /** Set or change a value in the table.  */
-       bool set(const std::string& key, long value);
-
-       /** Create an entry in the table, no value though. */
-       bool set(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.
-               @return true if anything was actually removed.
-       */
-       bool remove(const std::string& key);
-
-       /** 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();
-
-       /** Delete all records from the cache. */
-       void purge();
-
-
-       private:
-
-       /**
-               Attempt to lookup a record, cache if needed.
-               Throw ConfigurationTableKeyNotFound if not found.
-               Caller should hold mLock because the returned reference points 
into the cache.
-       */
-       const ConfigurationRecord& lookup(const std::string& key);
-
-};
-
-
-typedef std::map<HashString, std::string> HashStringMap;
-
-class SimpleKeyValue {
-
-       protected:
-
-       HashStringMap mMap;
-
-       public:
-
-       /** Take a C string "A=B" and set map["A"]="B". */
-       void addItem(const char*);
-
-       /** Take a C string "A=B C=D E=F ..." and add all of the pairs to the 
map. */
-       void addItems(const char*s);
-
-       /** Return a reference to the string at map["key"]. */
-       const char* get(const char*) const;
-};
-
-
-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
-
-
-// vim: ts=4 sw=4
diff --git a/CommonLibs/ConfigurationTest.cpp b/CommonLibs/ConfigurationTest.cpp
deleted file mode 100644
index 7042228..0000000
--- a/CommonLibs/ConfigurationTest.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-* Copyright 2009, 2010 Free Software Foundation, Inc.
-* Copyright 2010 Kestrel Signal Processing, Inc.
-*
-*
-* This software is distributed under the terms of the GNU Affero Public 
License.
-* See the COPYING file in the main directory for details.
-*
-* This use of this software may be subject to additional restrictions.
-* See the LEGAL file in the main directory for details.
-
-       This program is free software: you can redistribute it and/or modify
-       it under the terms of the GNU Affero General Public License as 
published by
-       the Free Software Foundation, either version 3 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 Affero General Public License for more details.
-
-       You should have received a copy of the GNU Affero General Public License
-       along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-
-#include "Configuration.h"
-#include <iostream>
-#include <string>
-
-using namespace std;
-
-ConfigurationKeyMap getConfigurationKeys();
-ConfigurationTable gConfig("exampleconfig.db","test", getConfigurationKeys());
-
-void purgeConfig(void*,int,char const*, char const*, sqlite3_int64)
-{
-       //cout << "update hook" << endl;
-       gConfig.purge();
-}
-
-
-int main(int argc, char *argv[])
-{
-
-       gConfig.setUpdateHook(purgeConfig);
-
-       const char *keys[5] = {"key1", "key2", "key3", "key4", "key5"};
-
-       for (int i=0; i<5; i++) {
-               gConfig.set(keys[i],i);
-       }
-
-       for (int i=0; i<5; i++) {
-               cout << "table[" << keys[i] << "]=" << gConfig.getStr(keys[i]) 
<<  endl;
-               cout << "table[" << keys[i] << "]=" << gConfig.getNum(keys[i]) 
<<  endl;
-       }
-
-       for (int i=0; i<5; i++) {
-               cout << "defined table[" << keys[i] << "]=" << 
gConfig.defines(keys[i]) <<  endl;
-       }
-
-       gConfig.set("key5","100 200 300  400 ");
-       std::vector<unsigned> vect = gConfig.getVector("key5");
-       cout << "vect length " << vect.size() << ": ";
-       for (unsigned i=0; i<vect.size(); i++) cout << " " << vect[i];
-       cout << endl;
-       std::vector<string> svect = gConfig.getVectorOfStrings("key5");
-       cout << "vect length " << svect.size() << ": ";
-       for (unsigned i=0; i<svect.size(); i++) cout << " " << svect[i] << ":";
-       cout << endl;
-
-       cout << "bool " << gConfig.getBool("booltest") << endl;
-       gConfig.set("booltest",1);
-       cout << "bool " << gConfig.getBool("booltest") << endl;
-       gConfig.set("booltest",0);
-       cout << "bool " << gConfig.getBool("booltest") << endl;
-
-       gConfig.getStr("newstring");
-       gConfig.getNum("numnumber");
-
-
-       SimpleKeyValue pairs;
-       pairs.addItems(" a=1 b=34 dd=143 ");
-       cout<< pairs.get("a") << endl;
-       cout<< pairs.get("b") << endl;
-       cout<< pairs.get("dd") << endl;
-
-       gConfig.set("fkey","123.456");
-       float fval = gConfig.getFloat("fkey");
-       cout << "fkey " << fval << endl;
-
-       cout << "search fkey:" << endl;
-       gConfig.find("fkey",cout);
-       cout << "search fkey:" << endl;
-       gConfig.find("fkey",cout);
-       gConfig.remove("fkey");
-       cout << "search fkey:" << endl;
-       gConfig.find("fkey",cout);
-
-       try {
-               gConfig.getNum("supposedtoabort");
-       } catch (ConfigurationTableKeyNotFound) {
-               cout << "ConfigurationTableKeyNotFound exception successfully 
caught." << endl;
-       }
-}
-
-ConfigurationKeyMap getConfigurationKeys()
-{
-       ConfigurationKeyMap map;
-       ConfigurationKey *tmp;
-
-       tmp = new ConfigurationKey("booltest","0",
-               "",
-               ConfigurationKey::DEVELOPER,
-               ConfigurationKey::BOOLEAN,
-               "",
-               false,
-               ""
-       );
-       map[tmp->getName()] = *tmp;
-       free(tmp);
-
-       tmp = new ConfigurationKey("numnumber","42",
-               "",
-               ConfigurationKey::DEVELOPER,
-               ConfigurationKey::VALRANGE,
-               "0-100",
-               false,
-               ""
-       );
-       map[tmp->getName()] = *tmp;
-       free(tmp);
-
-       tmp = new ConfigurationKey("newstring","new string value",
-               "",
-               ConfigurationKey::DEVELOPER,
-               ConfigurationKey::STRING,
-               "",
-               false,
-               ""
-       );
-       map[tmp->getName()] = *tmp;
-       free(tmp);
-
-       return map;
-}
diff --git a/CommonLibs/Makefile.am b/CommonLibs/Makefile.am
index ed188d5..d42e82a 100644
--- a/CommonLibs/Makefile.am
+++ b/CommonLibs/Makefile.am
@@ -36,9 +36,7 @@
        Sockets.cpp \
        Threads.cpp \
        Timeval.cpp \
-       Logger.cpp \
-       Configuration.cpp \
-       sqlite3util.cpp
+       Logger.cpp
 
 noinst_PROGRAMS = \
        BitVectorTest \
@@ -47,7 +45,6 @@
        SocketsTest \
        TimevalTest \
        VectorTest \
-       ConfigurationTest \
        LogTest
 
 #      ReportingTest
@@ -61,12 +58,10 @@
        Threads.h \
        Timeval.h \
        Vector.h \
-       Configuration.h \
-       Logger.h \
-       sqlite3util.h
+       Logger.h
 
 BitVectorTest_SOURCES = BitVectorTest.cpp
-BitVectorTest_LDADD = libcommon.la $(SQLITE3_LIBS)
+BitVectorTest_LDADD = libcommon.la
 
 PRBSTest_SOURCES = PRBSTest.cpp
 
@@ -82,15 +77,12 @@
 TimevalTest_LDADD = libcommon.la
 
 VectorTest_SOURCES = VectorTest.cpp
-VectorTest_LDADD = libcommon.la $(SQLITE3_LIBS)
-
-ConfigurationTest_SOURCES = ConfigurationTest.cpp
-ConfigurationTest_LDADD = libcommon.la         $(SQLITE3_LIBS)
+VectorTest_LDADD = libcommon.la
 
 # ReportingTest_SOURCES = ReportingTest.cpp
-# ReportingTest_LDADD = libcommon.la $(SQLITE_LA)
+# ReportingTest_LDADD = libcommon.la
 
 LogTest_SOURCES = LogTest.cpp
-LogTest_LDADD = libcommon.la $(SQLITE3_LIBS)
+LogTest_LDADD = libcommon.la
 
 MOSTLYCLEANFILES += testSource testDestination
diff --git a/CommonLibs/sqlite3util.cpp b/CommonLibs/sqlite3util.cpp
deleted file mode 100644
index 2b19ee6..0000000
--- a/CommonLibs/sqlite3util.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
-* Copyright 2010 Kestrel Signal Processing, Inc.
-* All rights reserved.
-*/
-
-
-#include <sqlite3.h>
-#include "sqlite3util.h"
-
-#include <string.h>
-#include <unistd.h>
-#include <stdio.h>
-
-
-// Wrappers to sqlite operations.
-// These will eventually get moved to commonlibs.
-
-int sqlite3_prepare_statement(sqlite3* DB, sqlite3_stmt **stmt, const char* 
query)
-{
-        int src = SQLITE_BUSY;
-        while (src==SQLITE_BUSY) {
-                src = sqlite3_prepare_v2(DB,query,strlen(query),stmt,NULL);
-                if (src==SQLITE_BUSY) {
-                        usleep(100000);
-                }
-        }
-        if (src) {
-                fprintf(stderr,"sqlite3_prepare_v2 failed for \"%s\": 
%s\n",query,sqlite3_errmsg(DB));
-                sqlite3_finalize(*stmt);
-        }
-        return src;
-}
-
-int sqlite3_run_query(sqlite3* DB, sqlite3_stmt *stmt)
-{
-       int src = SQLITE_BUSY;
-       while (src==SQLITE_BUSY) {
-               src = sqlite3_step(stmt);
-               if (src==SQLITE_BUSY) {
-                       usleep(100000);
-               }
-       }
-       if ((src!=SQLITE_DONE) && (src!=SQLITE_ROW)) {
-               fprintf(stderr,"sqlite3_run_query failed: %s: %s\n", 
sqlite3_sql(stmt), sqlite3_errmsg(DB));
-       }
-       return src;
-}
-
-
-bool sqlite3_exists(sqlite3* DB, const char *tableName,
-               const char* keyName, const char* keyData)
-{
-       size_t stringSize = 100 + strlen(tableName) + strlen(keyName) + 
strlen(keyData);
-       char query[stringSize];
-       sprintf(query,"SELECT * FROM %s WHERE %s == 
\"%s\"",tableName,keyName,keyData);
-       // Prepare the statement.
-       sqlite3_stmt *stmt;
-       if (sqlite3_prepare_statement(DB,&stmt,query)) return false;
-       // Read the result.
-       int src = sqlite3_run_query(DB,stmt);
-       sqlite3_finalize(stmt);
-       // Anything there?
-       return (src == SQLITE_ROW);
-}
-
-
-
-bool sqlite3_single_lookup(sqlite3* DB, const char *tableName,
-               const char* keyName, const char* keyData,
-               const char* valueName, unsigned &valueData)
-{
-       size_t stringSize = 100 + strlen(valueName) + strlen(tableName) + 
strlen(keyName) + strlen(keyData);
-       char query[stringSize];
-       sprintf(query,"SELECT %s FROM %s WHERE %s == 
\"%s\"",valueName,tableName,keyName,keyData);
-       // Prepare the statement.
-       sqlite3_stmt *stmt;
-       if (sqlite3_prepare_statement(DB,&stmt,query)) return false;
-       // Read the result.
-       int src = sqlite3_run_query(DB,stmt);
-       bool retVal = false;
-       if (src == SQLITE_ROW) {
-               valueData = (unsigned)sqlite3_column_int64(stmt,0);
-               retVal = true;
-       }
-       sqlite3_finalize(stmt);
-       return retVal;
-}
-
-
-// This function returns an allocated string that must be free'd by the caller.
-bool sqlite3_single_lookup(sqlite3* DB, const char* tableName,
-               const char* keyName, const char* keyData,
-               const char* valueName, char* &valueData)
-{
-       valueData=NULL;
-       size_t stringSize = 100 + strlen(valueName) + strlen(tableName) + 
strlen(keyName) + strlen(keyData);
-       char query[stringSize];
-       sprintf(query,"SELECT %s FROM %s WHERE %s == 
\"%s\"",valueName,tableName,keyName,keyData);
-       // Prepare the statement.
-       sqlite3_stmt *stmt;
-       if (sqlite3_prepare_statement(DB,&stmt,query)) return false;
-       // Read the result.
-       int src = sqlite3_run_query(DB,stmt);
-       bool retVal = false;
-       if (src == SQLITE_ROW) {
-               const char* ptr = (const char*)sqlite3_column_text(stmt,0);
-               if (ptr) valueData = strdup(ptr);
-               retVal = true;
-       }
-       sqlite3_finalize(stmt);
-       return retVal;
-}
-
-
-// This function returns an allocated string that must be free'd by tha caller.
-bool sqlite3_single_lookup(sqlite3* DB, const char* tableName,
-               const char* keyName, unsigned keyData,
-               const char* valueName, char* &valueData)
-{
-       valueData=NULL;
-       size_t stringSize = 100 + strlen(valueName) + strlen(tableName) + 
strlen(keyName) + 20;
-       char query[stringSize];
-       sprintf(query,"SELECT %s FROM %s WHERE %s == 
%u",valueName,tableName,keyName,keyData);
-       // Prepare the statement.
-       sqlite3_stmt *stmt;
-       if (sqlite3_prepare_statement(DB,&stmt,query)) return false;
-       // Read the result.
-       int src = sqlite3_run_query(DB,stmt);
-       bool retVal = false;
-       if (src == SQLITE_ROW) {
-               const char* ptr = (const char*)sqlite3_column_text(stmt,0);
-               if (ptr) valueData = strdup(ptr);
-               retVal = true;
-       }
-       sqlite3_finalize(stmt);
-       return retVal;
-}
-
-
-
-
-bool sqlite3_command(sqlite3* DB, const char* query)
-{
-       // Prepare the statement.
-       sqlite3_stmt *stmt;
-       if (sqlite3_prepare_statement(DB,&stmt,query)) return false;
-       // Run the query.
-       int src = sqlite3_run_query(DB,stmt);
-       sqlite3_finalize(stmt);
-       return src==SQLITE_DONE;
-}
-
-
-
diff --git a/CommonLibs/sqlite3util.h b/CommonLibs/sqlite3util.h
deleted file mode 100644
index f2b3aa7..0000000
--- a/CommonLibs/sqlite3util.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef SQLITE3UTIL_H
-#define SQLITE3UTIL_H
-
-#include <sqlite3.h>
-
-int sqlite3_prepare_statement(sqlite3* DB, sqlite3_stmt **stmt, const char* 
query);
-
-int sqlite3_run_query(sqlite3* DB, sqlite3_stmt *stmt);
-
-bool sqlite3_single_lookup(sqlite3* DB, const char *tableName,
-               const char* keyName, const char* keyData,
-               const char* valueName, unsigned &valueData);
-
-bool sqlite3_single_lookup(sqlite3* DB, const char* tableName,
-               const char* keyName, const char* keyData,
-               const char* valueName, char* &valueData);
-
-// This function returns an allocated string that must be free'd by the caller.
-bool sqlite3_single_lookup(sqlite3* DB, const char* tableName,
-               const char* keyName, unsigned keyData,
-               const char* valueName, char* &valueData);
-
-bool sqlite3_exists(sqlite3* DB, const char* tableName,
-               const char* keyName, const char* keyData);
-
-/** Run a query, ignoring the result; return true on success. */
-bool sqlite3_command(sqlite3* DB, const char* query);
-
-#endif
diff --git a/Makefile.am b/Makefile.am
index da08bf3..658eae4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -21,7 +21,7 @@
 include $(top_srcdir)/Makefile.common
 
 ACLOCAL_AMFLAGS = -I config
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(USB_INCLUDES) $(WITH_INCLUDES) 
$(SQLITE3_CFLAGS)
+AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(USB_INCLUDES) $(WITH_INCLUDES)
 AM_CXXFLAGS = -Wall -pthread -ldl
 #AM_CXXFLAGS = -Wall -O2 -NDEBUG -pthread -ldl
 #AM_CFLAGS = -Wall -O2 -NDEBUG -pthread -ldl
diff --git a/Transceiver52M/Makefile.am b/Transceiver52M/Makefile.am
index 20d0bd6..dc6e597 100644
--- a/Transceiver52M/Makefile.am
+++ b/Transceiver52M/Makefile.am
@@ -97,7 +97,7 @@
        libtransceiver.la \
        $(ARCH_LA) \
        $(GSM_LA) \
-       $(COMMON_LA) $(SQLITE3_LIBS)
+       $(COMMON_LA)
 
 if USRP1
 libtransceiver_la_SOURCES += USRPDevice.cpp
diff --git a/configure.ac b/configure.ac
index 01bec91..1a9712a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -158,10 +158,7 @@
 AM_CONDITIONAL(ARCH_ARM, [test "x$with_neon" = "xyes" || test 
"x$with_neon_vfpv4" = "xyes"])
 AM_CONDITIONAL(ARCH_ARM_A15, [test "x$with_neon_vfpv4" = "xyes"])
 
-AC_CHECK_LIB(sqlite3, sqlite3_open, , AC_MSG_ERROR(sqlite3 is not available))
-
 PKG_CHECK_MODULES(LIBUSB, libusb-1.0)
-PKG_CHECK_MODULES(SQLITE3, sqlite3)
 
 AC_CHECK_HEADER([boost/config.hpp],[],
     [AC_MSG_ERROR([boost/config.hpp not found, install e.g. libboost-dev])])
diff --git a/debian/control b/debian/control
index b9ed72a..c8a639e 100644
--- a/debian/control
+++ b/debian/control
@@ -5,7 +5,6 @@
 Build-Depends: debhelper (>= 9),
                autotools-dev,
                autoconf-archive,
-               libsqlite3-dev,
                pkg-config,
                dh-autoreconf,
                libuhd-dev,
diff --git a/debian/copyright b/debian/copyright
index 45d0e6d..b7790f2 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -52,20 +52,6 @@
                      the U.S. Army Research Laboratory.
 License: BSD-3-clause
 
-Files: CommonLibs/sqlite3util.cpp
-Copyright: 2010 Kestrel Signal Processing Inc.
-License: none
- No license described for file.
-Comment: In the previous version of the file in the git repository
- at upstream it is written:
-   Written by David A. Burgess, Kestrel Signal Processing, Inc., 2010
-   The author disclaims copyright to this source code.
- In the git log, this is written:
-   I do not claim any copyright over this change, as it's very basic.
-   Looking forward to see it merged into mainline.
- See revision e766abbf82f02473038a83fd2f78befd08544cab at
- https://github.com/osmocom/osmo-trx
-
 Files: debian/*
 Copyright: 2015 Ruben Undheim <ruben.undh...@gmail.com>
 License: GPL-3+

-- 
To view, visit https://gerrit.osmocom.org/5704
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I823aea91367d586507bbf352f1b6f25bdd635baa
Gerrit-PatchSet: 1
Gerrit-Project: osmo-trx
Gerrit-Branch: master
Gerrit-Owner: Pau Espin Pedrol <pes...@sysmocom.de>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Pau Espin Pedrol <pes...@sysmocom.de>
Gerrit-Reviewer: Vadim Yanitskiy <axilira...@gmail.com>

Reply via email to