2
from optparse import SUPPRESS_HELP
4
from sqlalchemy.orm.query import Query
5
from sqlalchemy.orm import sessionmaker
6
from sqlalchemy.ext.compiler import compiles
7
from sqlalchemy.sql.expression import Executable, ClauseElement, _literal_as_text
8
from flexget import manager
9
from flexget.plugin import register_parser_option
10
from flexget.event import event
12
log = logging.getLogger('explain_sql')
15
class Explain(Executable, ClauseElement):
17
def __init__(self, stmt):
18
self.statement = _literal_as_text(stmt)
22
def explain(element, compiler, **kw):
23
text = 'EXPLAIN QUERY PLAN ' + compiler.process(element.statement)
27
class ExplainQuery(Query):
30
log.info('Query:\n\t%s' % unicode(self).replace('\n', '\n\t'))
31
explain = self.session.execute(Explain(self)).fetchall()
32
text = '\n\t'.join('|'.join(str(x) for x in line) for line in explain)
34
result = Query.__iter__(self)
35
log.info('Query Time: %0.3f Explain Query Plan:\n\t%s' % (time() - before, text))
39
@event('manager.execute.started')
40
def register_sql_explain(man):
41
if man.options.explain_sql:
42
maininit = manager.Session.__init__
44
def init(*args, **kwargs):
45
kwargs['query_cls'] = ExplainQuery
46
return maininit(*args, **kwargs)
48
manager.Session.__init__ = init
51
@event('manager.execute.completed')
52
def deregister_sql_explain(man):
53
if man.options.explain_sql:
54
manager.Session = sessionmaker()
57
register_parser_option('--explain-sql', action='store_true', dest='explain_sql', default=False,