private static function buildRanges($rows) { $ranges = array(); $currentClientId = -1; // stack with the open connections of the client $sessions = array(); for ($i = 0, $count = count($rows); $i < $count; $i++) { $row = $rows[$i]; if ($currentClientId != $row['client_id']) { // maybe online? if (count($sessions) > 0) { foreach ($sessions as $range) { $onlineTime = $range->getTimeFromStart(); if ($onlineTime < Config::get("max_online_time", OnlineRange::MAX_ONLINE_TIME)) { // FIXME if a user is connected multiple times what happens? OnlineRange::$online_ranges[$range->user->master_client_id] = $range; Logger::log(" online user {$currentClientId} [{$range->user->master_client_id}] for {$onlineTime} seconds"); } else { Logger::log(" " . count($sessions) . " pending sessions of client_id = {$currentClientId}"); } } } $sessions = array(); $currentClientId = $row['client_id']; } if ($row['type'] == 'c') { $user = OnlineRange::getUser($row['user_id']); $ip = $row['ip']; $start = new DateTime($row['date']); $start_id = $row['event_id']; $range = new OnlineRange($start, null, $user, $ip); $range->start_id = $start_id; $sessions[] = $range; } else { if ($row['type'] == 'd') { if (count($sessions) == 0) { Logger::log(" No sessions found in stack for client_id = {$currentClientId}"); continue; } $end = new DateTime($row['date']); $end_id = $rows[$i]['event_id']; $range = array_pop($sessions); $range->end = $end; $range->end_id = $end_id; if (!isset(OnlineRange::$last_online[$range->user->master_client_id]) || Utils::getTimestamp($end) > Utils::getTimestamp(OnlineRange::$last_online[$range->user->master_client_id])) { OnlineRange::$last_online[$range->user->master_client_id] = $end; } if (Utils::getTimestamp($range->end) - Utils::getTimestamp($range->start) <= Config::get("max_online_time", OnlineRange::MAX_ONLINE_TIME)) { $ranges[] = $range; } } else { foreach ($sessions as $session) { $end = new DateTime($row['date']); $end_id = -1; $range = $session; $range->end = $end; $range->end_id = $end_id; Logger::log("Removed session " . Utils::formatDate($range->start) . " crash on " . Utils::formatDate($end)); if (!isset(OnlineRange::$last_online[$range->user->master_client_id]) || Utils::getTimestamp($end) > Utils::getTimestamp(OnlineRange::$last_online[$range->user->master_client_id])) { OnlineRange::$last_online[$range->user->master_client_id] = $end; } if (Utils::getTimestamp($range->end) - Utils::getTimestamp($range->start) <= Config::get("max_online_time", OnlineRange::MAX_ONLINE_TIME)) { $ranges[] = $range; } } $sessions = []; } } } return $ranges; }