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 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))