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
);
create table newsgroup_message (
create table message (
id INTEGER PRIMARY KEY NOT NULL,
created_on DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
newsgroup_id INTEGER NOT NULL,
message_id TEXT NOT NULL UNIQUE,
reference_ids TEXT,
sender TEXT NOT NULL,
subject TEXT NOT NULL,
content TEXT NOT NULL,
FOREIGN KEY(newsgroup_id) REFERENCES newsgroup(id)
content TEXT NOT NULL
);
create index newsgroup_message_newsgroup_id_idx on newsgroup_message (
newsgroup_id, id
create table newsgroup_message (
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 (
newsgroup_id, created_on
create unique index newsgroup_message_newsgroup_id_idx on newsgroup_message (
newsgroup_id, message_id
);
create table server_permission (

View file

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

View file

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