From 894ec39b1a4ad2f47c8df3f6b4399e8432504477 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sat, 23 Nov 2024 00:20:06 -0500 Subject: [PATCH] This is a bit more likely to work --- lib/nntp/tiny/session.py | 55 +++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index 2c08809..a3f5327 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -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))