comparison fetchnews.php @ 3:0dcdb73cbcbf

Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 12 Apr 2011 01:47:09 +0200
parents 40e545510a57
children 01dc7eeaf5df
comparison
equal deleted inserted replaced
2:40e545510a57 3:0dcdb73cbcbf
1 #!/usr/bin/php
1 <?php 2 <?php
2 chdir(__DIR__); 3 chdir(__DIR__);
3 require_once './pdo.php'; 4 require_once './common.php';
4 require_once './config.php';
5 5
6 foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) { 6 foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) {
7 $socket = stream_socket_client($peer['address']); 7 $socket = stream_socket_client($peer['address']);
8 if ($socket === FALSE) die("Could not connect to peer $peer[address]\n"); 8 if ($socket === FALSE) die("Could not connect to peer $peer[address]\n");
9 $line = nntp_readline($socket); 9 $line = nntp_readline($socket);
42 $groupmessage = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `message` = ?', array($group['id'], $message['id'])); 42 $groupmessage = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `message` = ?', array($group['id'], $message['id']));
43 if (!$groupmessage) { 43 if (!$groupmessage) {
44 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $message['id'])); 44 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $message['id']));
45 } 45 }
46 } else { 46 } else {
47 nntp_writeline($socket, 'HEAD '.$i); 47 nntp_writeline($socket, 'ARTICLE '.$i);
48 $line = nntp_readline($socket); 48 $line = nntp_readline($socket);
49 $code = strtok($line, " \t"); 49 $code = strtok($line, " \t");
50 if ($code != 221) die("Error code $code from $peer[address]\n"); 50 if ($code != 220) die("Error code $code from $peer[address]\n");
51 strtok(" \t"); //article number 51 strtok(" \t"); //article number
52 $lines = nntp_readlines($socket); 52 $lines = nntp_readlines($socket);
53 nntp_removeheader(&$lines, 'Xref'); 53 try {
54 nntp_updatepath(&$lines, 'pNewss.Core.UCIS.nl'); 54 nntp_article_store($lines);
55 $header = implode("\r\n", $lines); 55 } catch (Exception $ex) {
56 56 writelog($ex->getMessage());
57 nntp_writeline($socket, 'BODY '.$i); 57 }
58 $line = nntp_readline($socket);
59 $code = strtok($line, " \t");
60 if ($code != 222) die("Error code $code from $peer[address]\n");
61 strtok(" \t"); //article number
62 $lines = nntp_readlines($socket);
63 $body = implode("\r\n", $lines);
64
65 $id = $db->insert('INSERT INTO `messages` (`messageid`, `header`, `body`) VALUES (?, ?, ?)', array($messageid, $header, $body));
66 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $id));
67 } 58 }
68 } 59 }
69 $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group'])); 60 $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group']));
70 } 61 }
71 } 62 }
111 } 102 }
112 nntp_writeline($socket, 'QUIT'); 103 nntp_writeline($socket, 'QUIT');
113 fclose($socket); 104 fclose($socket);
114 } 105 }
115 106
116 function nntp_removeheader(&$lines, $header) { 107 function writelog($line) {
117 $header = strtoupper($header).':'; 108 print($line."\n");
118 $hlen = strlen($header);
119 foreach ($lines as $key => $line) if (strtoupper(substr($line, 0, $hlen)) == $header) unset($lines[$key]);
120 } 109 }
121 function nntp_updatepath(&$lines, $value) {
122 $header = strtoupper('Path').':';
123 $hlen = strlen($header);
124 $found = FALSE;
125 foreach ($lines as &$line) if (strtoupper(substr($line, 0, $hlen)) == $header) {
126 $parts = explode(': ', $line, 2);
127 $parts[1] = $value.'!'.$parts[1];
128 $line = implode(': ', $parts);
129 $found = TRUE;
130 break;
131 }
132 if (!$found) $lines[] = 'Path: '.$value;
133 }
134
135 function nntp_readline($socket) {
136 $line = rtrim(fgets($socket, 512), "\r\n");
137 print('R: '.$line."\n");
138 return $line;
139 }
140 function nntp_writeline($socket, $line) {
141 print('W: '.$line."\n");
142 fwrite($socket, $line."\r\n");
143 }
144 function nntp_readlines($socket) {
145 $line = nntp_readline($socket);
146 $lines = array();
147 while ($line != '.' && $line !== FALSE && $line !== FALSE) {
148 $lines[] = $line;
149 $line = nntp_readline($socket);
150 }
151 if ($line != '.') die("Unexpected end of message header\n");
152 return $lines;
153 }