This is a bit more likely to work
This commit is contained in:
parent
9a4febca5c
commit
894ec39b1a
1 changed files with 43 additions and 12 deletions
|
@ -4,6 +4,7 @@ import re
|
||||||
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from nntp.tiny.db import Database
|
||||||
from nntp.tiny.server import Server, ServerCapability
|
from nntp.tiny.server import Server, ServerCapability
|
||||||
from nntp.tiny.response import Response, ResponseCode
|
from nntp.tiny.response import Response, ResponseCode
|
||||||
from nntp.tiny.newsgroup import Newsgroup
|
from nntp.tiny.newsgroup import Newsgroup
|
||||||
|
@ -42,16 +43,16 @@ class MessageRange():
|
||||||
|
|
||||||
return "?"
|
return "?"
|
||||||
|
|
||||||
def __dict__(self):
|
def where(self):
|
||||||
if self.id is not None:
|
if self.id is not None:
|
||||||
return {'id': self.id}
|
return "id = %d" % (self.id)
|
||||||
|
|
||||||
if self.min is not None and self.max is None:
|
if self.min is not None and self.max is None:
|
||||||
return { 'min(id)': self.min }
|
return "id >= %d" % (self.min)
|
||||||
elif self.min is not None and self.max is not None:
|
elif self.min is not None and self.max is not None:
|
||||||
return { 'min(id)': self.min, 'max(id)': self.max }
|
return "id >= %d and id <= %d" % (self.min, self.max)
|
||||||
elif self.min is None and self.max is not None:
|
elif self.min is None and self.max is not None:
|
||||||
return { 'max(id)': self.max }
|
return "id <= %d" % (self.max)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse(r: str):
|
def parse(r: str):
|
||||||
|
@ -100,6 +101,7 @@ class Session():
|
||||||
|
|
||||||
def __init__(self, server: Server, sock: socket.socket):
|
def __init__(self, server: Server, sock: socket.socket):
|
||||||
self.server: Server = server
|
self.server: Server = server
|
||||||
|
self.db: Database = server.db
|
||||||
self.state: SessionState = SessionState.NONE
|
self.state: SessionState = SessionState.NONE
|
||||||
self.sock: socket.socket = sock
|
self.sock: socket.socket = sock
|
||||||
self.buf: LineBuffer = LineBuffer()
|
self.buf: LineBuffer = LineBuffer()
|
||||||
|
@ -151,7 +153,7 @@ class Session():
|
||||||
newsgroup_id = ?
|
newsgroup_id = ?
|
||||||
"""
|
"""
|
||||||
|
|
||||||
cr = self.server.db.execute(sql, (newsgroup.id))
|
cr = self.db.execute(sql, (newsgroup.id))
|
||||||
row = cr.fetchone()
|
row = cr.fetchone()
|
||||||
|
|
||||||
text = "%d %d %d %s" % (
|
text = "%d %d %d %s" % (
|
||||||
|
@ -167,6 +169,27 @@ class Session():
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def _newsgroup_summary(self, newsgroup: Newsgroup) -> str:
|
||||||
|
sql = """
|
||||||
|
select
|
||||||
|
count(id),
|
||||||
|
min(id),
|
||||||
|
max(id)
|
||||||
|
from
|
||||||
|
newsgroup_message
|
||||||
|
where
|
||||||
|
newsgroup_id = ?
|
||||||
|
"""
|
||||||
|
|
||||||
|
cr = self.db.execute(sql, (newsgroup.id))
|
||||||
|
row = cr.fetchone()
|
||||||
|
|
||||||
|
return "%d %d %d %s" % (
|
||||||
|
row[0],
|
||||||
|
row[1],
|
||||||
|
row[2],
|
||||||
|
newsgroup.name
|
||||||
|
)
|
||||||
|
|
||||||
def _cmd_listgroup(self, *args):
|
def _cmd_listgroup(self, *args):
|
||||||
newsgroup = self.newsgroup
|
newsgroup = self.newsgroup
|
||||||
|
@ -179,16 +202,24 @@ class Session():
|
||||||
if newsgroup is None:
|
if newsgroup is None:
|
||||||
return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_FOUND)
|
return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_FOUND)
|
||||||
|
|
||||||
values = {
|
sql = """
|
||||||
'newsgroup_id': newsgroup.id
|
select
|
||||||
}
|
id
|
||||||
|
from
|
||||||
|
newsgroup_message
|
||||||
|
where
|
||||||
|
newsgroup_id = ?
|
||||||
|
"""
|
||||||
|
|
||||||
if len(args) > 1:
|
if len(args) > 1:
|
||||||
msgrange = MessageRange.parse(args[1])z
|
msgrange = MessageRange.parse(args[1])
|
||||||
|
|
||||||
values.update(dict(msgrange))
|
sql += " and " msgrange.clause()
|
||||||
|
|
||||||
cr = self.server.db.query(Message, values)
|
text = self._newsgroup_summary(newsgroup)
|
||||||
|
cr = self.db.execute(sql, (newsgroup.id))
|
||||||
|
|
||||||
|
self.respond(ResponseCode.NNTP_GROUP_LISTING, text)
|
||||||
|
|
||||||
for message in cr.each():
|
for message in cr.each():
|
||||||
self.print(str(message.id))
|
self.print(str(message.id))
|
||||||
|
|
Loading…
Add table
Reference in a new issue