Mercurial > hg > pnewss
view fetchnews.php @ 1:61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Mon, 11 Apr 2011 23:17:27 +0200 |
parents | d7ab68b71c74 |
children | 40e545510a57 |
line wrap: on
line source
<?php require_once './pdo.php'; require_once './config.php'; foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) { $socket = stream_socket_client($peer['address']); if ($socket === FALSE) die("Could not connect to peer $peer[address]\n"); $line = nntp_readline($socket); $code = strtok($line, " \t"); if ($code != 200) die("Error code $code from $peer[address]\n"); foreach ($db->evalAllAssoc('SELECT * FROM `peergroups` WHERE `peer` = ?', $peer['id']) as $peergroup) { $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `id` = ?', $peergroup['group']); nntp_writeline($socket, 'GROUP '.$group['name']); $line = nntp_readline($socket); $code = strtok($line, " \t"); if ($code != 211) die("Error code $code from $peer[address]\n"); strtok(" \t"); //number of articles $low = strtok(" \t"); $high = strtok(" \t"); strtok(" \t"); //group name if ($low != $peergroup['low'] || $high != $peergroup['high'] || $peergroup['low'] === NULL || $peergroup['high'] === NULL) { for ($i = $low; $i <= $high; $i++) { if ($i >= $peergroup['low'] && $i <= $peergroup['high'] && $peergroup['low'] !== NULL && $peergroup['high'] !== NULL) continue; nntp_writeline($socket, 'STAT '.$i); $line = nntp_readline($socket); $code = strtok($line, " \t"); if ($code == 423) { print("Gap in article numbering at $i\n"); continue; } if ($code != 223) die("Error code $code from $peer[address]\n"); strtok(" \t"); //article number $messageid = strtok(" \t"); if ($messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') die("Malformed message ID $messageid\n"); $messageid = substr($messageid, 1, -1); $message = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $messageid); if ($message) { $groupmessage = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `message` = ?', array($group['id'], $message['id'])); if (!$groupmessage) { $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $message['id'])); } } else { nntp_writeline($socket, 'HEAD '.$i); $line = nntp_readline($socket); $code = strtok($line, " \t"); if ($code != 221) die("Error code $code from $peer[address]\n"); strtok(" \t"); //article number $lines = nntp_readlines($socket); nntp_removeheader(&$lines, 'Xref'); nntp_updatepath(&$lines, 'pNewss.Core.UCIS.nl'); $header = implode("\r\n", $lines); nntp_writeline($socket, 'BODY '.$i); $line = nntp_readline($socket); $code = strtok($line, " \t"); if ($code != 222) die("Error code $code from $peer[address]\n"); strtok(" \t"); //article number $lines = nntp_readlines($socket); $body = implode("\r\n", $lines); $id = $db->insert('INSERT INTO `messages` (`messageid`, `header`, `body`) VALUES (?, ?, ?)', array($messageid, $header, $body)); $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $id)); } } $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group'])); } } nntp_writeline($socket, 'QUIT'); fclose($socket); } function nntp_removeheader(&$lines, $header) { $header = strtoupper($header).':'; $hlen = strlen($header); foreach ($lines as $key => $line) if (strtoupper(substr($line, 0, $hlen)) == $header) unset($lines[$key]); } function nntp_updatepath(&$lines, $value) { $header = strtoupper('Path').':'; $hlen = strlen($header); $found = FALSE; foreach ($lines as &$line) if (strtoupper(substr($line, 0, $hlen)) == $header) { $parts = explode(': ', $line, 2); $parts[1] = $value.'!'.$parts[1]; $line = implode(': ', $parts); $found = TRUE; break; } if (!$found) $lines[] = 'Path: '.$value; } function nntp_readline($socket) { $line = rtrim(fgets($socket, 512), "\r\n"); print('R: '.$line."\n"); return $line; } function nntp_writeline($socket, $line) { print('W: '.$line."\n"); fwrite($socket, $line."\r\n"); } function nntp_readlines($socket) { $line = nntp_readline($socket); $lines = array(); while ($line != '.' && $line !== FALSE && $line !== FALSE) { $lines[] = $line; $line = nntp_readline($socket); } if ($line != '.') die("Unexpected end of message header\n"); return $lines; }