Refactor messages to belong to any number of newsgroups

This commit is contained in:
XANTRONIX Development 2024-11-30 16:34:22 -05:00
parent ce260c75ad
commit c9d6798f24
3 changed files with 63 additions and 51 deletions

View file

@ -8,25 +8,26 @@ create table newsgroup (
description TEXT NOT NULL description TEXT NOT NULL
); );
create table newsgroup_message ( create table message (
id INTEGER PRIMARY KEY NOT NULL, id INTEGER PRIMARY KEY NOT NULL,
created_on DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, created_on DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
newsgroup_id INTEGER NOT NULL,
message_id TEXT NOT NULL UNIQUE, message_id TEXT NOT NULL UNIQUE,
reference_ids TEXT, reference_ids TEXT,
sender TEXT NOT NULL, sender TEXT NOT NULL,
subject TEXT NOT NULL, subject TEXT NOT NULL,
content TEXT NOT NULL, content TEXT NOT NULL
FOREIGN KEY(newsgroup_id) REFERENCES newsgroup(id)
); );
create index newsgroup_message_newsgroup_id_idx on newsgroup_message ( create table newsgroup_message (
newsgroup_id, id newsgroup_id INTEGER NOT NULL,
message_id INTEGER NOT NULL,
FOREIGN KEY(newsgroup_id) REFERENCES newsgroup(id),
FOREIGN KEY(message_id) REFERENCES message(id)
); );
create index newsgroup_message_newsgroup_date_idx on newsgroup_message ( create unique index newsgroup_message_newsgroup_id_idx on newsgroup_message (
newsgroup_id, created_on newsgroup_id, message_id
); );
create table server_permission ( create table server_permission (

View file

@ -76,16 +76,18 @@ class MessageRange():
return "?" return "?"
def where(self): def where(self, table=None):
prefix = '' if table is None else f"{table}."
if self.id is not None: if self.id is not None:
return "id = %d" % (self.id) return prefix + "message_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 "id >= %d" % (self.min) return prefix + "message_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 "id >= %d and id <= %d" % (self.min, self.max) return prefix + "message_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 "id <= %d" % (self.max) return prefix + "message_id <= %d" % (self.max)
@staticmethod @staticmethod
def parse(r: str): def parse(r: str):
@ -127,17 +129,15 @@ class Message(DatabaseTable):
'_body', '_body',
'_key', '_key',
'id', 'id',
'newsgroup_id',
'state', 'state',
'line', 'line',
'content', 'content',
) )
name = 'newsgroup_message' name = 'message'
key = 'id' key = 'id'
columns = ( columns = (
'id', 'id',
'newsgroup_id',
'created_on', 'created_on',
'message_id', 'message_id',
'reference_ids', 'reference_ids',
@ -149,16 +149,15 @@ class Message(DatabaseTable):
RE_HEADER = re.compile(r'^([A-Za-z0-9\-]+): (.*)$') RE_HEADER = re.compile(r'^([A-Za-z0-9\-]+): (.*)$')
def __init__(self): def __init__(self):
self._cache = dict() self._cache = dict()
self._headers = None self._headers = None
self._headers_lc = None self._headers_lc = None
self._body = None self._body = None
self._key = None self._key = None
self.id = None self.id = None
self.newsgroup_id = None self.state = MessageState.EMPTY
self.state = MessageState.EMPTY self.line = None
self.line = None self.content = ''
self.content = ''
@staticmethod @staticmethod
def __from_row__(row): def __from_row__(row):
@ -171,7 +170,6 @@ class Message(DatabaseTable):
message.content = row['content'] message.content = row['content']
message.id = row['id'] message.id = row['id']
message.newsgroup_id = row['newsgroup_id']
message.created_on = row['created_on'] message.created_on = row['created_on']
message.message_id = row['message_id'] message.message_id = row['message_id']
message.reference_ids = row['reference_ids'] message.reference_ids = row['reference_ids']
@ -182,7 +180,6 @@ class Message(DatabaseTable):
def __values__(self) -> tuple: def __values__(self) -> tuple:
return ( return (
self.newsgroup_id,
self.created_on, self.created_on,
self.message_id, self.message_id,
self.reference_ids, self.reference_ids,

View file

@ -126,9 +126,9 @@ class Session():
sql = """ sql = """
select select
count(id), count(message_id),
min(id), min(message_id),
max(id) max(message_id)
from from
newsgroup_message newsgroup_message
where where
@ -167,12 +167,12 @@ class Session():
sql = """ sql = """
select select
max(id) max(message_id)
from from
newsgroup_message newsgroup_message
where where
newsgroup_id = ? newsgroup_id = ?
and id < ? and message_id < ?
""" """
cr = self.db.execute(sql, (self.newsgroup.id, self.article_id)) cr = self.db.execute(sql, (self.newsgroup.id, self.article_id))
@ -194,11 +194,11 @@ class Session():
sql = """ sql = """
select select
min(id) min(message_id)
from from
newsgroup_message newsgroup_message
where where
newsgroup_id = ? message_id = ?
and id > ? and id > ?
""" """
@ -215,9 +215,9 @@ class Session():
def _newsgroup_summary(self, newsgroup: Newsgroup) -> str: def _newsgroup_summary(self, newsgroup: Newsgroup) -> str:
sql = """ sql = """
select select
count(id), count(message_id),
min(id), min(message_id),
max(id) max(message_id)
from from
newsgroup_message newsgroup_message
where where
@ -247,7 +247,7 @@ class Session():
sql = """ sql = """
select select
id message_id
from from
newsgroup_message newsgroup_message
where where
@ -272,8 +272,8 @@ class Session():
def _newsgroup_summary(self, newsgroup: Newsgroup): def _newsgroup_summary(self, newsgroup: Newsgroup):
sql = """ sql = """
select select
min(id), min(message_id),
max(id) max(message_id)
from from
newsgroup_message newsgroup_message
where where
@ -312,11 +312,13 @@ class Session():
def _newsgroup_last_active(self, newsgroup: Newsgroup): def _newsgroup_last_active(self, newsgroup: Newsgroup):
sql = """ sql = """
select select
max(created_on) max(message.created_on)
from from
newsgroup_message newsgroup_message,
message
where where
newsgroup_id = ? message.id = newsgroup_message.id
and newsgroup_message.newsgroup_id = ?
""" """
cr = self.db.execute(sql, (newsgroup.id,)) cr = self.db.execute(sql, (newsgroup.id,))
@ -460,12 +462,14 @@ class Session():
sql = """ sql = """
select select
message_id message.id
from from
newsgroup_message newsgroup_message,
message
where where
newsgroup_id = ? message.id = newsgroup_message.message_id
and created_on >= ? and newsgroup_message.newsgroup_id = ?
and message.created_on >= ?
""" """
for name in self.server.newsgroups: for name in self.server.newsgroups:
@ -538,8 +542,18 @@ class Session():
msgrange = MessageRange.parse(identifier) msgrange = MessageRange.parse(identifier)
sql = f"select * from {Message.name} where " sql = """
sql += " newsgroup_id = ? and " + msgrange.where() select
message.*
from
newsgroup_message,
message
where
message.id = newsgroup_message.id
and newsgroup_message.newsgroup_id = ?
"""
sql += " and " + msgrange.where('message')
cr = self.db.query_sql(Message, sql, (self.newsgroup.id,)) cr = self.db.query_sql(Message, sql, (self.newsgroup.id,))