www.pudn.com > ghs1.2.rar > warehouse.cpp


#include "warehouse.h"
#include 
#include 
#include 
#include 

using namespace std;

WareHouse::WareHouse(string mLog, long sTime, int newSign)
{

  measureLog = mLog;
  fstream fdLog1;
  /* Open the measure.log file to store system infomation */
  newDataSign = newSign;

  fdLog1.open(measureLog.c_str(), ios::in); 
  if (!fdLog1.is_open())  {
    if (DEBUG_ON == 1) cout << "\n the log file doesn't exist, create a new measure log file " << endl;
    newDataSign = 1;
  }
  else {
    fdLog1.close();
  }
  
  if (newDataSign == 0) {
    fdLog1.open(measureLog.c_str(), ios::in);
    if (!fdLog1.is_open()) {
      cout << "\n can not open the measurement log file " << endl;
      exit(1);
    } 
  } 
  else {
    fdLog.open(measureLog.c_str(), ios::out);
    if (!fdLog.is_open()) {
      cout << "\n can not create the measurement log file " << endl;
      exit(1);
    }  
  }

  if (newDataSign == 1) {
    fdLog << "date          meanUtil       meanLambda        meanServ         meanStd" << endl;
    lineNum = 1;
  } 
  else {
    lineNum = myFile.GetLineNum(measureLog);
    int currTime = sTime / 3600;
    if (DEBUG_ON == 1) cout << "the currTime is " << currTime << endl;

    string line;
    int measureTime = 0;
    getline(fdLog1, line);
    while (fdLog1.good())
    {
      getline(fdLog1, line);
      if(line.size()==0) {
        measureTime++;
        break;
      }
      const string sepa = " ";
      string timeStr;
      string::size_type endId;
      endId = line.find_first_of(sepa, 0);
      timeStr = line.substr(0, endId);
      measureTime = atoi(timeStr.c_str());
      if (DEBUG_ON == 1) cout << "the time is " << measureTime << endl;
    }

    if (measureTime == 0) measureTime = currTime; 
    
    fdLog1.close();
    fdLog.open(measureLog.c_str(), fstream::out | fstream::app);
    if(!fdLog.is_open())
    {
      cout << "\n can not open the measurement log file \n";
      exit(1);
    }  

    float invalidValue = INVALID_PARA_VALUE;
    if ( (currTime - measureTime) > MAX_HOUR )
    {
      fdLog.close();
      RemoveLines(measureLog.c_str(), lineNum - 1);
      fdLog.open(measureLog.c_str(), fstream::out | fstream::app);
    }
    else
    {
      while ( measureTime < currTime) 
      {
        if ( lineNum >= (MAX_HOUR + 1) )
        {
          fdLog.close();
          RemoveLines(measureLog.c_str(), (lineNum - MAX_HOUR));
          lineNum = MAX_HOUR;
          fdLog.open(measureLog.c_str(), fstream::out | fstream::app);
        }

        fdLog << measureTime << " ";
        fdLog.width(15);
        fdLog << invalidValue << " ";
        fdLog.width(15);
        fdLog << invalidValue << " ";
        fdLog.width(15);
        fdLog << invalidValue << " ";
        fdLog.width(15);
        fdLog << invalidValue << endl;
        measureTime ++;
        lineNum ++;
      }
    }
  }
}

void
WareHouse::RemoveLines(const string& fileName, int lineOfNum)
{
  fstream resourceFile;
  fstream resourceFiletmp;
  string fname;

  resourceFile.open(fileName.c_str(), ios::in);
  if (!resourceFile.is_open())
  {
    cout << "can not open resource file to delete lines " << endl;
    exit(1);
  }

  fname = fileName + ".ttmp";

  resourceFiletmp.open(fname.c_str(), ios::out);
  if (!resourceFiletmp.is_open())
  {
    cout << "can not open resource tmp file " << endl;
    exit(1);
  }

  int lineCount = 0;
  string linetmp;
  while (resourceFile.good())
  {
    getline(resourceFile, linetmp);
    if (DEBUG_ON == 1) cout << "the line is " << linetmp << endl;
    if ( (lineCount > lineOfNum) || (lineCount == 0) ) // leave the first line there
    {
      resourceFiletmp << linetmp << endl; //???
    };
    lineCount++;
  }

  resourceFile.close();
  resourceFiletmp.close();

  string cpCmd = "cp " + fname + " " + fileName;

  if (popen(cpCmd.c_str(), "r") == NULL)
  {
    cout << "can not execute cp command " << endl;
    exit(1);
  }
}

void
WareHouse::RecordParameters(int timestamp, double util, double arrivalrate, double servicerate, double servicestd)
{
  if ( lineNum >= (MAX_HOUR + 1) )
  {
    fdLog.close();
    RemoveLines(measureLog.c_str(), (lineNum - MAX_HOUR));
    lineNum = MAX_HOUR;
    fdLog.open(measureLog.c_str(), fstream::out | fstream::app);
  }
  fdLog.precision(8);
  fdLog << timestamp << " ";
  fdLog.width(15);
  fdLog << util << " ";
  fdLog.width(15);
  fdLog << arrivalrate << " ";
  fdLog.width(15);
  fdLog << servicerate << " ";
  fdLog.width(15);
  fdLog << servicestd << endl;
  lineNum ++;
}