5
from datetime import datetime, timedelta
6
from sqlalchemy import Column, Integer, String, DateTime, Index
7
from flexget import schema
8
from flexget.utils.sqlalchemy_utils import table_schema
9
from flexget.manager import Session
10
from flexget.event import event
12
log = logging.getLogger('util.log')
13
Base = schema.versioned_base('log_once', 0)
16
@schema.upgrade('log_once')
17
def upgrade(ver, session):
19
log.info('Adding index to md5sum column of log_once table.')
20
table = table_schema('log_once', session)
21
Index('log_once_md5sum', table.c.md5sum, unique=True).create()
26
class LogMessage(Base):
29
__tablename__ = 'log_once'
31
id = Column(Integer, primary_key=True)
32
md5sum = Column(String, unique=True)
33
added = Column(DateTime, default=datetime.now())
35
def __init__(self, md5sum):
39
return "<LogMessage('%s')>" % self.md5sum
42
@event('manager.db_cleanup')
44
"""Purge old messages from database"""
45
old = datetime.now() - timedelta(days=365)
47
result = session.query(LogMessage).filter(LogMessage.added < old).delete()
49
log.verbose('Purged %s entries from log_once table.' % result)
52
def log_once(message, logger=logging.getLogger('log_once')):
54
Log message only once using given logger. Returns False if suppressed logging.
55
When suppressed verbose level is still logged.
58
digest = hashlib.md5()
59
digest.update(message.encode('latin1', 'replace')) # ticket:250
60
md5sum = digest.hexdigest()
64
# abort if this has already been logged
65
if session.query(LogMessage).filter_by(md5sum=md5sum).first():
66
logger.verbose(message)
69
row = LogMessage(md5sum)