By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,947 Members | 1,594 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,947 IT Pros & Developers. It's quick & easy.

my newsgroup base database. (test)

P: n/a
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Project: Network News Transport Protocol Server Program
Description:
基于数据库的新闻组,实现BBS前端使 NNTP协议来访问贴*
Reference:
NNTP协议: http://www.mibsoftware.com/userkt/0099.htm
*则表达式:
http://wiki.woodpecker.org.cn/moin/R...de24613d941e9d

-------------------------------------------------------------------------
python-chinese
Post: send py************@lists.python.cn
Subscribe: send subscribe to py********************@lists.python.cn
Unsubscribe: send unsubscribe to
py********************@lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese
-------------------------------------------------------------------------
"""

import sys
import socket
import threading
import time
import asyncore, asynchat
import string, StringIO, re
#from netkiller import *
#import testMessages
from messages import Messages

#print Messages.banner

class nntp_server (asyncore.dispatcher):

channel_counter = 0

def __init__ (self, host, port):
asyncore.dispatcher.__init__ (self)
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.there = (host, port)
self.bind (self.there)
self.listen (5)
def handle_connect(self):
pass
def handle_accept (self):
conn, addr = self.accept()
nntp_receiver (self, (conn, addr))
def handle_error(self):
pass
def handle_close (self):
self.close()

class nntp_receiver (asynchat.async_chat):

def __init__ (self, server, (conn, addr)):
asynchat.async_chat.__init__ (self, conn)
self.set_terminator ('\r\n')
self.server = server
self.server.channel_counter = self.server.channel_counter + 1
self.id = self.server.channel_counter
#self.sender = nntp_sender (self, server.there)
#self.sender.id = self.id
self.buffer = ''
self.handle_connect()
self.current_group = group_selected(None)
def handle_connect (self):
if self.connected :
self.push(Messages.banner)

def collect_incoming_data (self, data):
self.buffer = self.buffer + data

def found_terminator (self):
data = self.buffer
self.buffer = ''
if self.get_terminator() == '\r\n':
parse = self.isCommand(data)
if parse:
parse[0] = parse[0].lower()
self.log('command:'+parse[0])
usenet(self,parse,self.current_group)
if parse[0] == 'post':
self.set_terminator ('.\r\n')
if parse[0] == 'quit':
self.handle_close()
else:
usenet(self,['post',data],self.current_group)
self.set_terminator ('\r\n')

message = '<== (%d) %s' % (self.server.channel_counter,
repr(data))
self.log(message)
#self.log('current:'+self.current_group.get_group( ))
#self.sender.push (data + '\n')
def close_when_done():
pass
def handle_close (self):
self.log('Closing')
self.server.channel_counter = self.server.channel_counter - 1
#self.sender.close()
self.close()

def isCommand(self,data):
rcommand = (
r'^mode [reader|stream]',
r'^list$',r'^list
[active|active.times|newsgroups|subscriptions]',
r'^xover [0-9]+-[0-9]+',
r'^newgroups [0-9]+ [0-9]+ ',
r'^group .+',
r'^newgroups [0-9]+ [0-9]+ [a-zA-Z]',
r'^head [0-9]+',
r'^body [0-9]+',
r'^article [0-9]+',
r'^post$',r'^next$',r'^last$',
r'^ihave$',r'^slave$',
r'^help$',r'^quit$'
)
parse = []
for command in rcommand:
digs = re.compile(command,re.IGNORECASE)
if digs.match(data):
parse = data.split(' ')
return parse
self.push("500 command not recognized\r\n")
return None
"""
class nntp_sender (asynchat.async_chat):

def __init__ (self, receiver, address):
asynchat.async_chat.__init__ (self)
self.receiver = receiver
self.set_terminator (None)
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.buffer = ''
self.set_terminator ('\n')
self.connect (address)

def handle_connect (self):
print 'Connected'

def collect_incoming_data (self, data):
self.buffer = self.buffer + data

def found_terminator (self):
data = self.buffer
self.buffer = ''
print '==(%d) %s' % (self.id, repr(data))
self.receiver.push (data + '\n')

def handle_close (self):
self.receiver.close()
self.close()
"""
class group_selected:
#current = None
def __init__(self,value):
self.set_group(value)
def set_group(self,value):
self.current = value
def get_group(self):
return self.current

class usenet:
#threading.Thread
conn = None
addr = None
buffer = None
msg = None
conn = None
current_group = None
HELP = """\
HELP \r\n
100 Legal commands \r\n
authinfo user Name|pass Password \r\n
article [MessageID|Number] \r\n
body [MessageID|Number] \r\n
check MessageID \r\n
date \r\n
group newsgroup \r\n
head [MessageID|Number] \r\n
help \r\n
ihave \r\n
last \r\n
list [active|active.times|newsgroups|subscriptions] \r\n
listgroup newsgroup \r\n
mode stream \r\n
mode reader \r\n
newgroups yymmdd hhmmss [GMT] [<distributions>] \r\n
newnews newsgroups yymmdd hhmmss [GMT] [<distributions>] \r\n
next \r\n
post \r\n
slave \r\n
stat [MessageID|Number] \r\n
takethis MessageID \r\n
xgtitle [group_pattern] \r\n
xhdr header [range|MessageID] \r\n
xover [range] \r\n
xpat header range|MessageID pat [morepat...] \r\n
.. \r\n"""

def __init__(self, conn,command,current_group):
self.conn = conn
self.buffer = buffer
self.msg = Messages()
self.current_group = current_group
command[0] = command[0].lower()
self.commands(command)
def welcome(self):
self.conn.send(self.msg.banner)
def commands(self, command):
if not buffer: return True
if command[0] == 'mode':
self.conn.push(self.msg.banner)
elif command[0] == 'list':
lists = self.msg.list()
length = str(len(lists))
self.conn.send("215 list of newsgroups follows\r\n")
for group in lists:
self.conn.push(group+"\r\n")
self.conn.push(".\r\n")
elif command[0] == 'group':
current = command[1]
isNone = self.msg.group(current)
if not isNone:
Responses(self.conn,411)
else:
self.current_group.set_group(current)
number,first,last,group = isNone
self.conn.push("211 " +number+' '+first+' '+last+'
'+group+ " selected\r\n")
elif command[0] == 'newgroups':
#newgroups = self.msg.newgroups(950803,192708,'GMT')
#length = len(newgroups)
self.conn.push("231 list of new newsgroups follows.\r\n")
#for name in newgroups:
# self.conn.push(name+"\r\n")
self.conn.push(".\r\n")
elif command[0] =='article':
MessageID = command[1]
text = self.msg.article(MessageID)
self.conn.push("220 "+MessageID+"
<ma**********@lists.mozilla.orgarticle retrieved - head and body
follows\r\n")
self.conn.push(text)
self.conn.push(".\r\n")
elif command[0] =='head':
MessageID = command[1]
self.conn.push("221 "+MessageID+"
<ma**********@lists.mozilla.org>\r\n")
self.conn.push(".\r\n")
elif command[0] =='body':
MessageID = command[0]
self.conn.push("222 "+MessageID+"
<ma**********@lists.mozilla.org>\r\n")
self.conn.push(".\r\n")
elif command[0] == 'xover':
if not self.current_group.get_group():
Responses(self.conn,412)
return
xover = command[1]
first, last = xover.split('-')
xovers = self.msg.xover(first,last)
#length = len(xovers)
self.conn.push("224 xover information follows\r\n")
"""
412 no newsgroup has been selected
"""
for xover in xovers:
self.conn.push( xover + "\r\n")
self.conn.push(".\r\n")
elif command[0] =='xhdr':
xhdr = command[1]
subject, range = xhdr.split(' ')
first, last = range.split('-')
self.msg.xhdr('subject',first,last)
#length = len(xover_list)
self.conn.push("221 "+subject+" field follows\r\n")
for xo in xover_list:
self.conn.send( xo + "\r\n")
self.conn.send(".\r\n")
elif command[0] == 'post':
if len(command) == 1:
self.conn.push("340 send article\r\n")
elif len(command) == 2:
data = command[1]
self.msg.post(data)
Responses(self.conn,240)
elif command[0] == 'rset':
self.conn.push("250 OK\r\n")
elif command[0] =='help':
self.conn.push(self.HELP)
elif command[0] =='quit':
self.conn.push("205 closing connection - goodbye!\r\n")
return True

def close(self):
self.conn.close()
self.buffer = None
self.conn = None
self.addr = None

class Responses:
conn = None
def __init__(self,conn,status):
self.conn = conn
if status == 205:
pass
elif status == 224:
self.conn.push('224 Overview information follows\r\n')

elif status == 240:
self.conn.push('240 article posted ok\r\n')
elif status == 340:
self.conn.push('340 send article to be posted. End with
<CR-LF>.<CR-LF>\r\n')
elif status == 411:
self.conn.push('411 no such news group\r\n')
elif status == 412:
self.conn.push('412 No news group current selected\r\n')
elif status == 420:
self.conn.push('420 No article(s) selected\r\n')

elif status == 440:
self.conn.push('440 posting not allowed\r\n')
elif status == 441:
self.conn.push('441 posting failed\r\n')
elif status == 502:
self.conn.push('502 no permission\r\n')

def main():
try:
nntpd = nntp_server('127.0.0.1',119)
asyncore.loop()
except KeyboardInterrupt:
print "Crtl+C pressed. Shutting down."
if __name__ == '__main__':
main()

Jul 4 '06 #1
Share this Question
Share on Google+
2 Replies


P: n/a

Netkiller 写道:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Project: Network News Transport Protocol Server Program
Description:
基于数据库的新闻组,实现BBS前端使 NNTP协议来访问贴*

import sys,re
import MySQLdb

class NewsDB:
conn = None
cursor = None
def connect(self):
try:
conn = MySQLdb.connect (host = "localhost",
user = "root",
passwd = "chen",
db = "usenet")
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
def fetchone(self,sql):
self.connect()
self.cursor = conn.cursor ()
self.cursor.execute (sql)
row = self.cursor.fetchone ()
#print "server version:", row[0]
self.close()
return row
def fetchall(self):
self.connect()
self.cursor = conn.cursor ()
self.cursor.execute (sql)
all = self.cursor.fetchall ()
#print "server version:", row[0]
self.close()
return all
def close(self):
self.cursor.close ()
self.conn.close()
class abstract:
subject = None
mail_from = None
rcpt_to = None
data = None

group = ""

grouplist = (
("cn.comp.linux", 5, 2, "y"),
("cn.comp.freebsd", 3, 2, "y"),
("cn.comp.dos", 10, 4, "y"),
("cn.test", 5, 2, "y"),
("comp.lang.python", 5, 2, "y")
)
def welcome(self):
return 'Welcome'
def list (self):
lists = []
for name, last, first, mode in self.grouplist:
lists.append(name+ " " + str(last) + " " + str(first) +" "+
mode)
return lists
def group(self,groupname):
group_rang = ""
for name, last, first, mode in self.grouplist:
if name == groupname:
group_rang = str(last - first)+" "+ str(first)+"
"+str(last)
break
return group_rang
def xover(self,first,last):
xover_tmp = []
xover_tmp.append("""2 Mozilla programmer needed for
children's learning program "John Fodor, PhD" <fo***@ilt-inc.com>
Mon, 23 Jan 2006 12:01:09 -0500
<ma******************************@lists.mozilla.or g 10532
276 Xref: number1.nntp.dca.giganews.com mozilla.jobs:2""")
xover_tmp.append("""3 mozilla expert needed "Paul
Sponagl" <sp*****@7val.com Tue, 7 Mar 2006 20:00:52 +0100
<ma********************************@lists.mozilla. org 2913
41 Xref: number1.nntp.dca.giganews.com mozilla.jobs:10""")
return xover_tmp
def head(self):
self.xover(first,last)
def xhdr(self,first,last):
xover_tmp = []
xover_tmp.append('1 HI "NNTP.HK"
<ad***@nntp.hk 14 Jun 2006 14:43:05 +0800
<44********@news.nntp.hk 1151 31 Xref:
news.nntp.hk vip.cicefans:1\r\n')
return xover_tmp
def newgroups(self,data,time,gmt):
lists = []
lists.append("cn.test.os")
lists.append("cn.test.qa")
return lists

class Messages(abstract):
banner = '200 \"Welcome to Netkiler News server\"\r\n'
conn= None
def __init__(self):

#self.db=_mysql.connect(host="localhost",user="roo t",passwd="chen",db="usenet")

self.conn=MySQLdb.connect(host="localhost",user="r oot",passwd="chen",db="usenet")
def list (self):
sql = """SELECT id,`group`,(select max(Number) from article) as
last, (select min(Number) from article) as first, p FROM list"""
#print sql
self.conn.query(sql)
result=self.conn.use_result()
group = []
for id, name, last, first, mode, in result.fetch_row(10):
group.append(name+ " " + str(last) + " " + str(first) +" "+
mode)
return group
def group(self,newsgroup):
sql = "SELECT `group`,(select count(Number) from article) as
number, (select max(Number) from article) as last, (select min(Number)
from article) as first FROM list where `group` = '%s' limit 1" %
(newsgroup)
#print sql
self.conn.query(sql)
result=self.conn.use_result()
#print result.fetch_row();
for name, number, last, first in result.fetch_row():
return (str(number),str(first),str(last),name)
def xover(self,first,last):
sql = "select * from article where Number BETWEEN %s AND %s" %
(first,last)
#print sql
cursor =self.conn.cursor()
cursor.execute(sql)
xovers = []
for Number, MessageID, Body, Date in cursor.fetchall():
parse = self.parseArticle(Body)
if 'Xref' in set(parse):
xref = '\t'+parse['Xref']
else:
xref = ''
if 'Lines' in set(parse):
lines = '\t'+parse['Lines']
else:
lines = ''

xovers.append(str(Number)+'\t'+parse['Subject']+'\t'+parse['From']+'\t'+parse['Date']+'\t<3d******@netkiller.hikz.com>\t'+str(len(Body) )+'\t'+lines+xref)
cursor.close ()
return xovers
def post(self,text):
sql = "insert into article(body, `date`) values('%s',now())" %
(text)
#print sql
cursor =self.conn.cursor()
cursor.execute(sql)
self.conn.commit()
cursor.close ()
#self.conn.close ()
#print "%d rows were updated" % cursor.rowcount
return cursor.rowcount
def article(self,id):
sql = "select * from article where Number='%s'" % (id)
#print sql
cursor =self.conn.cursor()
cursor.execute(sql)
#print cursor.fetchone();
row = cursor.fetchone()
# for Number, MessageID, Message, Date in cursor.fetchone():
# cursor.close ()
return row[2]
def head(self,id):
sql = "select * from article where Number='%s'" % (id)
#print sql
cursor =self.conn.cursor()
cursor.execute(sql)
#print cursor.fetchone();
row = cursor.fetchone()
# for Number, MessageID, Message, Date in cursor.fetchone():
# cursor.close ()
return row[2]
def body(self,id):
sql = "select * from article where Number='%s'" % (id)
#print sql
cursor =self.conn.cursor()
cursor.execute(sql)
#print cursor.fetchone();
row = cursor.fetchone()
# for Number, MessageID, Message, Date in cursor.fetchone():
# cursor.close ()
return row[2]
def parseArticle(self,data):
"""
From: "NEO" <op******@163.com>
Newsgroups: cn.test
Subject: test
Date: Fri, 30 Jun 2006 17:14:17 +0800
Lines: 3
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
X-RFC2646: Format=Flowed; Original
"""
#[a-zA-z0-9]+@[a-zA-z0-9]+.[a-zA-z]+
matchs = (
('From', r'From: (.+ <.+>)\r\n'),
('Newsgroups', r'Newsgroups: (.+)\r\n'),
('Subject', r'Subject: (.+)\r\n'),
('Date', r'Date: (.+)\r\n'),
('Lines', r'Lines: (.+)\r\n'),
('X-Priority', r'X-Priority: (.+)\r\n'),
('X-MSMail-Priority', r'X-MSMail-Priority: (.+)\r\n'),
('X-Newsreader', r'X-Newsreader: (.+)\r\n'),
('X-MimeOLE', r'X-MimeOLE: (.+)\r\n'),
('X-RFC2646', r'X-RFC2646: (.+)\r\n'),
('MIME-Version', r'MIME-Version: (.+)\r\n'),
('User-Agent', r'User-Agent: (.+)\r\n'),
('Content-Type', r'Content-Type: (.+)\r\n'),
('Content-Transfer-Encoding', r'Content-Transfer-Encoding:
(.+)\r\n'),
('Xref', r'Xref: (.+)\r\n'),

('Body', r'\r\n\r\n(.+)\r\n')
)
parse = {}
for head, value in matchs:
digs = re.compile(value,re.IGNORECASE)
for test in digs.findall(data):
parse[head] = test
return parse
def main():
test = Messages()
#print msg.banner
#print test.list()
#print test.group('cn.test')
print test.xover('25', '50')
#nntp.post('test')
#delete from article;
#text = test.article('25')
#print repr(text)
#print '---------------------'
#print test.parseArticle(text)
if __name__ == '__main__':
main()

Jul 4 '06 #2

P: n/a

Netkiller 写道:
Netkiller 写道:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Project: Network News Transport Protocol Server Program
Description:
基于数据库的新闻组,实现BBS前端使 NNTP协议来访问贴*


Database SQL Script follow:

-- phpMyAdmin SQL Dump
-- version 2.7.0-rc1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jul 04, 2006 at 02:47 PM
-- Server version: 4.1.18
-- PHP Version: 5.0.5
--
-- Database: `usenet`
--

-- --------------------------------------------------------

--
-- Table structure for table `article`
--

DROP TABLE IF EXISTS `article`;
CREATE TABLE IF NOT EXISTS `article` (
`Number` int(10) unsigned NOT NULL auto_increment,
`MessageID` varchar(255) NOT NULL default '',
`body` text NOT NULL,
`Date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`Number`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=40 ;

--
-- Dumping data for table `article`
--

INSERT INTO `article` VALUES (25, '', 'From: "NEO"
<op******@163.com>\r\nNewsgroups: cn.test\r\nSubject: test\r\nDate:
Fri, 30 Jun 2006 17:14:17 +0800\r\nLines: 3\r\nX-Priority:
3\r\nX-MSMail-Priority: Normal\r\nX-Newsreader: Microsoft Outlook
Express 6.00.2900.2180\r\nX-MimeOLE: Produced By Microsoft MimeOLE
V6.00.2900.2180\r\nX-RFC2646: Format=Flowed; Original\r\n\r\ntest !
\r\n\r\n\r\n', '2006-06-30 17:14:17');
INSERT INTO `article` VALUES (26, '', 'Date: Tue, 04 Jul 2006 11:34:54
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: aaaaaa\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\n wrote:\r\ntest ! \r\n\r\n\r\n-------------\r\n',
'2006-07-04 11:34:54');
INSERT INTO `article` VALUES (27, '', 'Date: Tue, 04 Jul 2006 13:57:07
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: bbbbbb\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nbbbbbbbbbbb\r\n', '2006-07-04 13:57:07');
INSERT INTO `article` VALUES (28, '', 'Date: Tue, 04 Jul 2006 13:58:17
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: bbbbbb\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nMy Usenet wrote:\r\nbbbbbbbbbbb\r\n', '2006-07-04
13:58:17');
INSERT INTO `article` VALUES (29, '', 'Date: Tue, 04 Jul 2006 14:28:00
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: cccccc\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\ncccccc\r\n', '2006-07-04 14:28:00');
INSERT INTO `article` VALUES (30, '', 'Date: Tue, 04 Jul 2006 14:29:02
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: cccccc My Usenet
<op******@163.com>\r\nContent-Type: text/plain; charset=ISO-8859-1;
format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nTue wrote:\r\n>
cccccc\r\n', '2006-07-04 14:29:02');
INSERT INTO `article` VALUES (31, '', 'Date: Tue, 04 Jul 2006 14:29:22
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: cccccc My Usenet\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nTue wrote:\r\nTue wrote:\r\n>cccccc\r\n', '2006-07-04
14:29:22');
INSERT INTO `article` VALUES (32, '', 'Date: Tue, 04 Jul 2006 14:29:55
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: ddddd\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nddddd\r\n', '2006-07-04 14:29:55');
INSERT INTO `article` VALUES (33, '', 'Date: Tue, 04 Jul 2006 14:31:32
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: dddddMy Usenet
<op******@163.com>\r\nContent-Type: text/plain; charset=ISO-8859-1;
format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nTue wrote:\r\n>
ddddd\r\n', '2006-07-04 14:31:32');
INSERT INTO `article` VALUES (34, '', 'Date: Tue, 04 Jul 2006 14:31:45
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: bbbbbb\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nMy Usenet wrote:\r\nbbbbbbbbbbb\r\n', '2006-07-04
14:31:45');
INSERT INTO `article` VALUES (35, '', 'Date: Tue, 04 Jul 2006 14:32:04
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: cccccc\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\ncccccc\r\n', '2006-07-04 14:32:04');
INSERT INTO `article` VALUES (36, '', 'Date: Tue, 04 Jul 2006 14:32:15
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: cccccc\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nMy Usenet wrote:\r\ncccccc\r\n', '2006-07-04 14:32:15');
INSERT INTO `article` VALUES (37, '', 'Date: Tue, 04 Jul 2006 14:32:18
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: cccccc\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nMy Usenet wrote:\r\ncccccc\r\n', '2006-07-04 14:32:18');
INSERT INTO `article` VALUES (38, '', 'Date: Tue, 04 Jul 2006 14:32:26
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: cccccc\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nMy Usenet wrote:\r\ncccccc\r\n', '2006-07-04 14:32:26');
INSERT INTO `article` VALUES (39, '', 'Date: Tue, 04 Jul 2006 14:32:32
+0800\r\nFrom: My Usenet <op******@163.com>\r\nUser-Agent: Thunderbird
1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups:
cn.test\r\nSubject: Re: cccccc\r\nContent-Type: text/plain;
charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding:
7bit\r\n\r\nMy Usenet wrote:\r\ncccccc\r\n', '2006-07-04 14:32:32');

-- --------------------------------------------------------

--
-- Table structure for table `list`
--

DROP TABLE IF EXISTS `list`;
CREATE TABLE IF NOT EXISTS `list` (
`id` int(10) unsigned NOT NULL auto_increment,
`group` varchar(255) NOT NULL default '',
`last` varchar(10) NOT NULL default '',
`first` varchar(10) NOT NULL default '',
`p` char(1) default 'y',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='RFC977 3.6.1. LIST'
AUTO_INCREMENT=3 ;

--
-- Dumping data for table `list`
--

INSERT INTO `list` VALUES (1, 'cn.test', '10', '5', 'y', '0000-00-00
00:00:00');
INSERT INTO `list` VALUES (2, 'cn.comp.os', '10', '5', 'y', '2006-06-27
00:00:00');

Jul 4 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.