summaryrefslogtreecommitdiff
path: root/Mailman/database/messagestore.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mailman/database/messagestore.py')
-rw-r--r--Mailman/database/messagestore.py31
1 files changed, 22 insertions, 9 deletions
diff --git a/Mailman/database/messagestore.py b/Mailman/database/messagestore.py
index e0e6cd9f1..7c90918ac 100644
--- a/Mailman/database/messagestore.py
+++ b/Mailman/database/messagestore.py
@@ -32,7 +32,6 @@ from zope.interface import implements
from Mailman import Utils
from Mailman.configuration import config
-from Mailman.database.model import Message
from Mailman.interfaces import IMessageStore
# It could be very bad if you have already stored files and you change this
@@ -46,6 +45,7 @@ class MessageStore:
implements(IMessageStore)
def add(self, message):
+ from Mailman.database.model import Message
# Ensure that the message has the requisite headers.
message_ids = message.get_all('message-id', [])
if len(message_ids) <> 1:
@@ -68,10 +68,9 @@ class MessageStore:
# providing a unique serial number, but to get this information, we
# have to use a straight insert instead of relying on Elixir to create
# the object.
- result = Message.table.insert().execute(
- hash=hash32, path=relpath, message_id=message_id)
+ row = Message(hash=hash32, path=relpath, message_id=message_id)
# Add the additional header.
- seqno = result.last_inserted_ids()[0]
+ seqno = row.id
del message['X-List-Sequence-Number']
message['X-List-Sequence-Number'] = str(seqno)
# Now calculate the full file system path.
@@ -97,11 +96,21 @@ class MessageStore:
return pickle.load(fp)
def get_messages_by_message_id(self, message_id):
- for msgrow in Message.query.filter_by(message_id=message_id):
+ # Avoid circular imports.
+ from Mailman.database.model.message import Message
+ for msgrow in config.db.store.find(Message, message_id=message_id):
yield self._msgobj(msgrow)
def get_messages_by_hash(self, hash):
- for msgrow in Message.query.filter_by(hash=hash):
+ # Avoid circular imports.
+ from Mailman.database.model.message import Message
+ # It's possible the hash came from a message header, in which case it
+ # will be a Unicode. However when coming from source code, it will
+ # always be an 8-string. Coerce to the latter if necessary; it must
+ # be US-ASCII.
+ if isinstance(hash, unicode):
+ hash = hash.encode('ascii')
+ for msgrow in config.db.store.find(Message, hash=hash):
yield self._msgobj(msgrow)
def _getmsg(self, global_id):
@@ -110,7 +119,9 @@ class MessageStore:
seqno = int(seqno)
except ValueError:
return None
- messages = Message.query.filter_by(id=seqno)
+ # Avoid circular imports.
+ from Mailman.database.model.message import Message
+ messages = config.db.store.find(Message, id=seqno)
if messages.count() == 0:
return None
assert messages.count() == 1, 'Multiple id matches'
@@ -126,11 +137,13 @@ class MessageStore:
@property
def messages(self):
- for msgrow in Message.query.filter_by().all():
+ # Avoid circular imports.
+ from Mailman.database.model.message import Message
+ for msgrow in config.db.store.find(Message):
yield self._msgobj(msgrow)
def delete_message(self, global_id):
msgrow = self._getmsg(global_id)
if msgrow is None:
raise KeyError(global_id)
- msgrow.delete()
+ config.db.store.remove(msgrow)