From 8fd86a50e53d8a55a2f1f76db143dab73ede045e Mon Sep 17 00:00:00 2001 From: "kurtis.heimerl" Date: Sun, 16 Dec 2012 06:23:29 +0000 Subject: [PATCH] OH GOOD GIT MISSED THESE FILES THANKS GIT git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@4630 19bc5d8c-e614-43d4-8b26-e1612bc8e597 --- CommonLibs/Reporting.cpp | 145 +++++++++++++++++++++++++++++++++++++++ CommonLibs/Reporting.h | 86 +++++++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 CommonLibs/Reporting.cpp create mode 100644 CommonLibs/Reporting.h diff --git a/CommonLibs/Reporting.cpp b/CommonLibs/Reporting.cpp new file mode 100644 index 00000000..3ea7eedb --- /dev/null +++ b/CommonLibs/Reporting.cpp @@ -0,0 +1,145 @@ +/**@file Module for performance-reporting mechanisms. */ +/* +* Copyright 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 . + +*/ + +#include "Reporting.h" +#include "Logger.h" +#include +#include + +static const char* createReportingTable = { + "CREATE TABLE IF NOT EXISTS REPORTING (" + "NAME TEXT UNIQUE NOT NULL, " + "VALUE INTEGER DEFAULT 0, " + "CLEAREDTIME INTEGER NOT NULL, " + "UPDATETIME INTEGER DEFAULT 0 " + ")" +}; + + +ReportingTable::ReportingTable(const char* filename) +{ + gLogEarly(LOG_INFO | mFacility, "opening reporting table from path %s", filename); + // Connect to the database. + int rc = sqlite3_open(filename,&mDB); + if (rc) { + gLogEarly(LOG_EMERG | mFacility, "cannot open reporting 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,createReportingTable)) { + gLogEarly(LOG_EMERG | mFacility, "cannot create reporting table in database at %s, error message: %s", filename, sqlite3_errmsg(mDB)); + } +} + + +bool ReportingTable::create(const char* paramName) +{ + char cmd[200]; + sprintf(cmd,"INSERT OR IGNORE INTO REPORTING (NAME,CLEAREDTIME) VALUES (\"%s\",%ld)", paramName, time(NULL)); + if (!sqlite3_command(mDB,cmd)) { + gLogEarly(LOG_CRIT|mFacility, "cannot create reporting parameter %s, error message: %s", paramName, sqlite3_errmsg(mDB)); + return false; + } + return true; +} + + + +bool ReportingTable::incr(const char* paramName) +{ + char cmd[200]; + sprintf(cmd,"UPDATE REPORTING SET VALUE=VALUE+1, UPDATETIME=%ld WHERE NAME=\"%s\"", time(NULL), paramName); + if (!sqlite3_command(mDB,cmd)) { + gLogEarly(LOG_CRIT|mFacility, "cannot increment reporting parameter %s, error message: %s", paramName, sqlite3_errmsg(mDB)); + return false; + } + return true; +} + + + +bool ReportingTable::max(const char* paramName, unsigned newVal) +{ + char cmd[200]; + sprintf(cmd,"UPDATE REPORTING SET VALUE=MAX(VALUE,%u), UPDATETIME=%ld WHERE NAME=\"%s\"", newVal, time(NULL), paramName); + if (!sqlite3_command(mDB,cmd)) { + gLogEarly(LOG_CRIT|mFacility, "cannot maximize reporting parameter %s, error message: %s", paramName, sqlite3_errmsg(mDB)); + return false; + } + return true; +} + + +bool ReportingTable::clear(const char* paramName) +{ + char cmd[200]; + sprintf(cmd,"UPDATE REPORTING SET VALUE=0, UPDATETIME=0, CLEAREDTIME=%ld WHERE NAME=\"%s\"", time(NULL), paramName); + if (!sqlite3_command(mDB,cmd)) { + gLogEarly(LOG_CRIT|mFacility, "cannot clear reporting parameter %s, error message: %s", paramName, sqlite3_errmsg(mDB)); + return false; + } + return true; +} + + +bool ReportingTable::create(const char* baseName, unsigned minIndex, unsigned maxIndex) +{ + size_t sz = strlen(baseName); + for (unsigned i = minIndex; i<=maxIndex; i++) { + char name[sz+10]; + sprintf(name,"%s.%u",baseName,i); + if (!create(name)) return false; + } + return true; +} + +bool ReportingTable::incr(const char* baseName, unsigned index) +{ + char name[strlen(baseName)+10]; + sprintf(name,"%s.%u",baseName,index); + return incr(name); +} + + +bool ReportingTable::max(const char* baseName, unsigned index, unsigned newVal) +{ + char name[strlen(baseName)+10]; + sprintf(name,"%s.%u",baseName,index); + return max(name,newVal); +} + + +bool ReportingTable::clear(const char* baseName, unsigned index) +{ + char name[strlen(baseName)+10]; + sprintf(name,"%s.%u",baseName,index); + return clear(name); +} + + + + diff --git a/CommonLibs/Reporting.h b/CommonLibs/Reporting.h new file mode 100644 index 00000000..18786185 --- /dev/null +++ b/CommonLibs/Reporting.h @@ -0,0 +1,86 @@ +/**@file Module for performance-reporting mechanisms. */ +/* +* Copyright 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 . + +*/ + +#ifndef REPORTING_H +#define REPORTING_H + +#include +#include + + +/** + Collect performance statistics into a database. + Parameters are counters or max/min trackers, all integer. +*/ +class ReportingTable { + + private: + + sqlite3* mDB; ///< database connection + int mFacility; ///< rsyslogd facility + + + + public: + + /** + Open the database connection; + create the table if it does not exist yet. + */ + ReportingTable(const char* filename); + + /** Create a new parameter. */ + bool create(const char* paramName); + + /** Create an indexed parameter set. */ + bool create(const char* baseBame, unsigned minIndex, unsigned maxIndex); + + /** Increment a counter. */ + bool incr(const char* paramName); + + /** Increment an indexed counter. */ + bool incr(const char* baseName, unsigned index); + + /** Take a max of a parameter. */ + bool max(const char* paramName, unsigned newVal); + + /** Take a max of an indexed parameter. */ + bool max(const char* paramName, unsigned index, unsigned newVal); + + /** Clear a value. */ + bool clear(const char* paramName); + + /** Clear an indexed value. */ + bool clear(const char* paramName, unsigned index); + + /** Dump the database to a stream. */ + void dump(std::ostream&) const; + +}; + +#endif + + +// vim: ts=4 sw=4