Example #1
0
void LOGDATA::ReadLog (void)
{
	const unsigned MAXSIZE = 200, MAXFIELD = 30;
	char logStr[MAXSIZE];
	char logValue[ELEMENTS][MAXFIELD];
	float logCost, logMbRec, logMbTransm;
	const char *beg, *end, *flagPtr;
	int compare, line = 1, i;
	long duration;
	bool insert, add;
	char *pos;
	NODE *TempNode;
	
	while (fgets(logStr, MAXSIZE, RADIUS_LOG_FILE))	{

		beg = logStr;
		end = logStr + strlen (logStr);

		for (i = 0; i < ELEMENTS; i++)
			if (!(flagPtr = Array.StrDisjoint (&beg, end, ';', logValue[i], MAXFIELD - 1)))
				break;

// ѕроверка на существование в строке всех требуемых полей
		if (!flagPtr)	{
			fprintf (stderr, "\nWarning: Syntax error in %s at line %d:\n",
   												OPTIONS->radius_log_file, line);
			fprintf (stderr, "%s\nString format required:\n", logStr);
			fprintf (stderr, "Session_dir;Transport;4d address;IP/telephone;"
					"Start time (DD.MM.YYYY HH:MM:SS); Stop time (DD.MM.YYYY HH:MM:SS);"
					"Mb transmitted;Mb received;Session cost\n");
			continue;
		}
// «апоминаем врем¤ начала лога
		if (line == 1)
			firstDate = Array.StrCopy (logValue[START_TIME]);
// ѕроверка на попадание в один из временных интервалов
		if (!OPTIONS->process_all_log && !CheckTimePeriod (logValue[START_TIME]))
			continue;
// ѕереводим числовые значени¤ из строк в числа (заменив ',' на '.')
		if (pos = strchr (logValue[COST], ','))	*pos = '.';
		logCost = atof (logValue[COST]);
		if (pos = strchr (logValue[MB_RECEIVED], ','))	*pos = '.';
		logMbRec = atof (logValue[MB_RECEIVED]);
		if (pos = strchr (logValue[MB_TRANSMITTED], ','))	*pos = '.';
		logMbTransm = atof (logValue[MB_TRANSMITTED]);

// «апомнили продолжительность сессии в минутах
		duration = (long) difftime (DateToSecs (logValue[STOP_TIME]), 
									DateToSecs (logValue[START_TIME])) / 60 + 1;
		i = 0;
		while (1)	{
// ¬ этом цикле ищем ноду в списке уже занесенных нод
// и либо вставл¤ем новую запись, либо обновл¤ем уже существующую
			insert = add = false;
			TempNode = new NODE (logValue[ADDRESS]);
			if (i >= nodes_number)	{
				if (OPTIONS->process_all_nodes)
    				insert = add = true;
				else
    				break;
			}
			else if (i)	{
				compare = TempNode->CompareWith (*Node[i]);
				if (OPTIONS->process_all_nodes)	{
					if (!compare)
						add = true;
					else if (compare < 0)
						insert = add = true;
				}
				else if (!compare)
					add = true;
				if (!insert)
					delete TempNode;
			}
			else
				add = true;
			
			if (insert)
// ¬ставл¤ем ноду в массив под номером i
				Node = Array.ArrayPush<NODE>
						(Node, TempNode, nodes_number++, i);
			if (add)	{
// ќбновл¤ем данные о ноде
				Node[i]->sessions.all++;
				Node[i]->time.all += duration;
				if (!stricmp (logValue[DIRECTION], "IN"))	{
					Node[i]->sessions.in++;
					Node[i]->time.in += duration;
				}
				else	{
					Node[i]->sessions.out++;
					Node[i]->time.out += duration;
				}
				Node[i]->traffic.in += logMbRec;
				Node[i]->traffic.out += logMbTransm;
				if (i)
					break;
				else
					if (stricmp (logValue[TRANSPORT], "IP"))
						cost_dial += logCost;
					else
						cost_IP += logCost;
			}
			if (insert)
				break;
			i++; line++;

		}

		if (lastDate)
			delete [] lastDate;
		lastDate = Array.StrCopy (logValue[STOP_TIME]);

	}

	cost_dial = fabs (cost_dial);
	cost_IP = fabs (cost_IP);
	cost_IP *= OPTIONS->cost_factor;
	cost_all = cost_IP + cost_dial;
	if (nodes_number > 1)	{
		Node = Array.ArrayPush<NODE>
 						(Node, new NODE (NULL, "Total"), nodes_number);
		for (i = 1; i < nodes_number; i++)	{
			Node[nodes_number]->sessions.in += Node[i]->sessions.in;
			Node[nodes_number]->sessions.out += Node[i]->sessions.out;
			Node[nodes_number]->sessions.all += Node[i]->sessions.all;
			Node[nodes_number]->time.in += Node[i]->time.in;
			Node[nodes_number]->time.out += Node[i]->time.out;
			Node[nodes_number]->time.all += Node[i]->time.all;
			Node[nodes_number]->traffic.in +=
   				(Node[i]->traffic.in = fabs (Node[i]->traffic.in));
			Node[nodes_number]->traffic.out +=
   				(Node[i]->traffic.out = fabs (Node[i]->traffic.out));
		}
		nodes_number++;
	}
}