This is a bit more likely to work

This commit is contained in:
XANTRONIX Development 2024-11-23 00:20:06 -05:00
parent 9a4febca5c
commit 894ec39b1a

View file

@ -4,6 +4,7 @@ import re
from typing import Optional
from nntp.tiny.db import Database
from nntp.tiny.server import Server, ServerCapability
from nntp.tiny.response import Response, ResponseCode
from nntp.tiny.newsgroup import Newsgroup
@ -42,16 +43,16 @@ class MessageRange():
return "?"
def __dict__(self):
def where(self):
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:
return { 'min(id)': self.min }
return "id >= %d" % (self.min)
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:
return { 'max(id)': self.max }
return "id <= %d" % (self.max)
@staticmethod
def parse(r: str):
@ -100,6 +101,7 @@ class Session():
def __init__(self, server: Server, sock: socket.socket):
self.server: Server = server
self.db: Database = server.db
self.state: SessionState = SessionState.NONE
self.sock: socket.socket = sock
self.buf: LineBuffer = LineBuffer()
@ -151,7 +153,7 @@ class Session():
newsgroup_id = ?
"""
cr = self.server.db.execute(sql, (newsgroup.id))
cr = self.db.execute(sql, (newsgroup.id))
row = cr.fetchone()
text = "%d %d %d %s" % (
@ -167,6 +169,27 @@ class Session():
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):
newsgroup = self.newsgroup
@ -179,16 +202,24 @@ class Session():
if newsgroup is None:
return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_FOUND)
values = {
'newsgroup_id': newsgroup.id
}
sql = """
select
id
from
newsgroup_message
where
newsgroup_id = ?
"""
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():
self.print(str(message.id))