Refactor messages to belong to any number of newsgroups
This commit is contained in:
parent
ce260c75ad
commit
c9d6798f24
3 changed files with 63 additions and 51 deletions
|
@ -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 (
|
||||||
|
|
|
@ -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',
|
||||||
|
@ -155,7 +155,6 @@ class Message(DatabaseTable):
|
||||||
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 = ''
|
||||||
|
@ -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,
|
||||||
|
|
|
@ -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,))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue