#include #include #include #include #include #include #include "post.h" const std::string nbspx3() { return "   "; } const std::string cell() { return ""; } inline const std::string local_itos(const int & i) { std::stringstream TheStream; TheStream << i; return TheStream.str(); } class SysDayStats { public: ~SysDayStats() {} SysDayStats(const std::string & campaign, const int & month, const int & day, const int & year) { std::string temp; std::ifstream fin; fin.open(("/tmp/" + campaign + ".helper." + local_itos(month) + "-" + local_itos(day) + "-" + local_itos(year)).c_str()); calls = 0; totalcalls = 0; abandons = 0; totalabandons = 0; disconnects = 0; noanswers = 0; busies = 0; congestions = 0; ansmachs = 0; if (fin) { valid = true; std::getline(fin, temp, '\n'); calls = atoi(temp.c_str()); std::getline(fin, temp, '\n'); totalcalls = atoi(temp.c_str()); std::getline(fin, temp, '\n'); abandons = atoi(temp.c_str()); std::getline(fin, temp, '\n'); totalabandons = atoi(temp.c_str()); std::getline(fin, temp, '\n'); datestring = atoi(temp.c_str()); std::getline(fin, temp, '\n'); disconnects = atoi(temp.c_str()); std::getline(fin, temp, '\n'); noanswers = atoi(temp.c_str()); std::getline(fin, temp, '\n'); busies = atoi(temp.c_str()); std::getline(fin, temp, '\n'); congestions = atoi(temp.c_str()); std::getline(fin, temp, '\n'); if (temp.empty()) { // We didn't get the full set of data, so it is invalid. valid = false; } ansmachs = atoi(temp.c_str()); } else { fin.close(); valid = false; } } const bool __Valid() { return valid; } const int __Calls() { return calls; } const int __TotalCalls() { return totalcalls; } const int __Abandons() { return abandons; } const int __TotalAbandons() { return totalabandons; } const int __Disconnects() { return disconnects; } const int __NoAnswers() { return noanswers; } const int __Busies() { return busies; } const int __Congestions() { return congestions; } const int __AnsMachs() { return ansmachs; } #define STATRES(x) static const int x() { \ \ int accumulator = 0; \ \ for (std::vector::iterator it = v.begin(); it != v.end(); it++) { \ \ if (it->__Valid()) { \ accumulator += it->__##x(); \ } \ \ } \ \ return accumulator; \ \ } STATRES(Calls) STATRES(TotalCalls) STATRES(Abandons) STATRES(TotalAbandons) STATRES(Disconnects) STATRES(NoAnswers) STATRES(Busies) STATRES(Congestions) STATRES(AnsMachs) // Let's be nice to time functions :) volatile static const unsigned long int getEpoch(const int & m, const int & d, const int & y) { tm thetime; thetime.tm_sec = 0; thetime.tm_min = 0; thetime.tm_hour = 0; thetime.tm_mday = d; thetime.tm_mon = m - 1; thetime.tm_year = y - 1900; time_t cur = mktime(&thetime); return static_cast(cur); } static const bool RangeMakesSense() { return rangeMakesSense; } static void LoadDateRange(const std::string & campaign, \ const int & m1, const int & d1, const int & y1, \ const int & m2, const int & d2, const int & y2) { if (!v.empty()) v.clear(); unsigned long int startEpoch = getEpoch(m1, d1, y1) - 86400, endEpoch = getEpoch(m2, d2, y2), currentEpoch; if (endEpoch < startEpoch) { rangeMakesSense = false; } else { rangeMakesSense = true; //std::cout << m1 << "-" << d1 << "-" << y1 << " --- " << startEpoch << "
\n"; //std::cout << m2 << "-" << d2 << "-" << y2 << " --- " << endEpoch << "

\n"; for (int y = y1; y < y2 + 1; y++) { for (int i = 1; i < 13; i++) { for (int j = 1; j < 32; j++) { currentEpoch = getEpoch(i,j,y); //std::cout << i << "-" << j << "-" << y << " --- "; //std::cout << currentEpoch << " - "; if (currentEpoch >= startEpoch && currentEpoch <= endEpoch) { v.push_back(SysDayStats(campaign, i,j,y)); //std::cout << "true"; } else { //std::cout << "false"; } //std::cout << "
\n"; } } } } } static const int Size() { return static_cast(v.size()); } private: static std::vector v; int calls, \ totalcalls, \ abandons, \ totalabandons, \ datestring, \ disconnects, \ noanswers, \ busies, \ congestions, \ ansmachs; bool valid; static bool rangeMakesSense; }; std::vector SysDayStats::v; bool SysDayStats::rangeMakesSense; int main() { Post TheFields("text/html"); std::cout << "Content-type: text/html\n" << std::endl; std::cout << "System Stats\n"; std::cout << "\n\n"; std::string campaign = TheFields.GetField("selection"); //std::string campaign = TheFields.GetField("campaign"); int m1 = atoi(TheFields.GetField("mon1").c_str()); int d1 = atoi(TheFields.GetField("day1").c_str()); int y1 = atoi(TheFields.GetField("year1").c_str()); int m2 = atoi(TheFields.GetField("mon2").c_str()); int d2 = atoi(TheFields.GetField("day2").c_str()); int y2 = atoi(TheFields.GetField("year2").c_str()); SysDayStats::LoadDateRange(campaign,m1,d1,y1,m2,d2,y2); if (SysDayStats::RangeMakesSense()) { if (SysDayStats::Size()) { std::cout << "System stats for " << campaign << ":" << "

\n"; std::cout << "
" << std::endl;
		std::cout << "Calls:                 " << SysDayStats::Calls() << std::endl;
//		std::cout << "Total Calls:           " << SysDayStats::TotalCalls() << std::endl;
		std::cout << "Abandons:              " << SysDayStats::Abandons() << std::endl;
//		std::cout << "Total Abandons:        " << SysDayStats::TotalAbandons() << std::endl;
		std::cout << "Disconnects:           " << SysDayStats::Disconnects() << std::endl;
		std::cout << "No Answers:            " << SysDayStats::NoAnswers() << std::endl;
		std::cout << "Busies:                " << SysDayStats::Busies() << std::endl;
		std::cout << "Congestions:           " << SysDayStats::Congestions() << std::endl;
		std::cout << "Answering Machines:    " << SysDayStats::AnsMachs() << std::endl;
		std::cout << "
" << std::endl; std::cout << "
Testing Area" << std::endl; std::cout << "
 " << std::endl; std::cout << cell() << "" << nbspx3() << std::endl; std::cout << cell() << "Calls" << nbspx3() << std::endl; std::cout << cell() << "Abns" << nbspx3() << std::endl; std::cout << cell() << "No Ans" << nbspx3() << std::endl; std::cout << cell() << "VM" << nbspx3() << std::endl; std::cout << cell() << "Busies" << nbspx3() << std::endl; std::cout << cell() << "Cong" << nbspx3() << std::endl; std::cout << cell() << "Fax" << nbspx3() << std::endl; std::cout << cell() << "Disc" << nbspx3() << std::endl; //std::cout << cell() << "Abn \%" << nbspx3() << std::endl; std::cout << "
" << std::endl; std::cout << cell() << campaign << nbspx3() << std::endl; std::cout << cell() << SysDayStats::Calls() << std::endl; std::cout << cell() << SysDayStats::Abandons() << std::endl; std::cout << cell() << SysDayStats::NoAnswers() << std::endl; std::cout << cell() << SysDayStats::AnsMachs() << std::endl; std::cout << cell() << SysDayStats::Busies() << std::endl; std::cout << cell() << SysDayStats::Congestions() << std::endl; //holding place for faxes std::cout << cell() << "0" << std::endl; std::cout << cell() << SysDayStats::Disconnects() << std::endl; std::cout << "
\n"; } else { std::cout << "No data for date range!" << std::endl; } } else { std::cout << "Date range doesn't make sense!" << std::endl; } std::cout << "\n\n"; return 0; }