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++; } }